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