Sha256: bd6a3b6d34be6b992c58c84146b7f6d7d4b8777e7909bd4f93a7142eb54517c9
Contents?: true
Size: 1.79 KB
Versions: 1
Compression:
Stored size: 1.79 KB
Contents
module Conversions #:nodoc: # Implements new accessor classmethods to define conversion accessors on active record classes. module ActiveRecordAccessors # Adds conversion methods to the model for a certain attribute. # # Options: # # * <tt>:internal</tt>: The unit of the internal value # * <tt>:external</tt>: The unit of desired external value # * <tt>:scale</tt>: If a scale is given, the external value is automatically rounded on the specified scale. # # # Examples: # # require 'conversions' # # class Flight # extend Conversions::ActiveRecordAccessors # # attr_accessor :distance # conversion_accessor :distance, :internal => :kilometers, :external => :miles, :scale => 2 # # def initialize(distance) # self.distance = distance # end # end # # flight = Flight.new(1200) # flight.distance_in_miles #=> 745.65, rounded down to two decimals as specified in :scale # # When used as a plugin for Rails, the ActiveRecord::Base is automatically extended. # # class Car < ActiveRecord::Base # conversion_accessor :length, :internal => :kilometers, :external => :miles # end def conversion_accessor(attribute, options={}) if options[:internal].nil? or options[:external].nil? raise ArgumentError, "Please specify both :external and :internal metrics." end define_method "#{attribute}_in_#{options[:external]}" do v = send(attribute) v ? v.send(:convert, options[:internal], options[:external], :scale => options[:scale]) : nil end define_method "#{attribute}_in_#{options[:external]}=" do |v| send("#{attribute}=", v.to_f.send(:convert, options[:external], options[:internal])) end end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
seamusabshere-conversions-1.3.0 | lib/conversions/active_record_accessors.rb |