module RailsMetadata::ClassMethods
Public Instance Methods
metadata(name, type=nil)
click to toggle source
# File lib/rails_metadata.rb, line 9 def metadata(name, type=nil) define_method(name.to_s) do self.metadata = {} unless self.metadata.present? self.metadata[name] end typecast = case type when nil then val when :boolean lambda do |v| if v.is_a?(String) if ["true", "1"].include?(v) return true elsif ["false", "0"].include?(v) return false else return !v.empty? end else return !!v end end when :string then lambda { |v| v.to_s } when :integer then lambda { |v| v.to_i } when :float then lambda { |v| v.to_f } when :array then lambda { |v| v.to_a } when :hash then lambda { |v| v.to_hash } else raise ArgumentError, "Invalid type(:boolean, :string, :integer, :float, :array, :hash)" end define_method(name.to_s + '=') do |val| self.metadata = {} unless self.metadata.present? if val.present? || val == false self.metadata.merge!(name => typecast.call(val)) else self.metadata.delete(name) end end end