How can I set up a proper getter/setter?

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.

class Measurable < ActiveRecord::Base

columns: id, unit_id, measurable_type_id, reliability_id, value,

created_at, updated_at

belongs_to :measurable_type

def value=(value)
# Has more than one value
if value.split(" “).size > 1
values = value.to_s.strip.split(” ") # split the mixed number to
whole number and fraction for conversion preparation
if values.size > 1
# a whole number and fraction was supplied
whole_number = values.first.to_i
fraction = values.last

    numerator    = values.last.split("/").first.to_d
    denominator  = values.last.split("/").last.to_d

    value = whole_number + (numerator / denominator)
 else
   # a fraction wasn't specified
   whole_number = values.first
   value = whole_number
 end
end

@value = value
super

end

end

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