> On 2016-Feb-8, at 19:19 , David McDonald <[email protected]> wrote:
>
> I have a model named, Measurable, that stores many different types of of
> measurements for different things. All the measurements can be represented
> as a decimal, so my value column is of datatype decimal. My users though
> wish to view and input these value is either integers or mixed numbers (ex:
> 31 1/8) as well, depending on the measurable_type. Right now I'm able to
> convert the mixed number to a decimal value and store it into my database as
> a proper decimal. But I'm trying to figure out how to convert it from a
> decimal value to the mixed number I'm wanting to show the user in my form, so
> they can make edits if necessary. Below I have the setter method I made, but
> my attempts at creating a proper getter haven't work. I'm not really sure
> how to go about it.
I think you want to at least consider using Ruby's Rational class to help.
Here's a pure Ruby example:
class Measurable
attr_accessor :id, :unit_id, :measurable_type_id, :reliability_id,
:created_at, :updated_at
attr_reader :value
# belongs_to :measurable_type
def initialize(input)
self.value = input
end
def value=(input)
case input
when String
# Has more than one value
if (parts = input.split(" ")).size > 1
result = parts.reduce(0) {|whole,part| whole + Rational(part) }
else
result = input.to_f
end
when Numeric
result = input
else
result = input.to_f
end
@value = result
end
def to_s
case self.value
when Rational
whole = self.value.floor
"%d %s"%[whole, (self.value - whole).to_s]
else
self.value.to_s
end
end
end
irb2.2.4> puts Measurable.new("31 1/8")
31 1/8
#2.2.4 => nil
irb2.2.4> puts Measurable.new("31.125")
31.125
#2.2.4 => nil
irb2.2.4> puts Measurable.new(31.125)
31.125
#2.2.4 => nil
There's also a to_r method to convert types to a Rational if your
"measurable_type" wanted to convert strictly to a Rational form.
-Rob
--
You received this message because you are subscribed to the Google Groups "Ruby
on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/rubyonrails-talk/D38B817D-65E4-4C2A-B17A-E1E9B2A9C808%40agileconsultingllc.com.
For more options, visit https://groups.google.com/d/optout.