> 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.

Reply via email to