class Property::Properties
Attributes
owner[RW]
Public Class Methods
json_create(serialized)
click to toggle source
# File lib/property/properties.rb, line 20 def self.json_create(serialized) self[serialized['data']] end
Public Instance Methods
[]=(key, value)
click to toggle source
Calls superclass method
Property::DirtyProperties#[]=
# File lib/property/properties.rb, line 28 def []=(key, value) if column = columns[key] if value.blank? if default = column.default_for(@owner) super(key, default) else delete(key) end elsif value.kind_of?(Hash) && column.klass <= Hash && column.caster.respond_to?(:merge_hash) orig = self[key] # We *MUST* duplicate hash here or Dirty will not function correctly. value = column.caster.merge_hash(orig ? orig.dup : {}, value) if value.blank? if default = column.default_for(@owner) super(key, default) else delete(key) end else super(key, value) end else super(key, column.type_cast(value)) end else super end end
columns()
click to toggle source
# File lib/property/properties.rb, line 102 def columns @owner.schema.columns end
merge!(attributes)
click to toggle source
We need to write our own merge so that typecasting is called
# File lib/property/properties.rb, line 58 def merge!(attributes) raise TypeError.new("can't convert #{attributes.class} into Hash") unless attributes.kind_of?(Hash) attributes.each do |key, value| self[key] = value end end
to_json(*args)
click to toggle source
# File lib/property/properties.rb, line 24 def to_json(*args) { 'json_class' => self.class.name, 'data' => Hash[self] }.to_json(*args) end
validate()
click to toggle source
# File lib/property/properties.rb, line 65 def validate column_names = columns.keys errors = @owner.errors no_errors = true original_hash = @original_hash || self bad_keys = keys - column_names missing_keys = column_names - keys keys_to_validate = keys - bad_keys bad_keys.each do |key| if original_hash[key] == self[key] # ignore invalid legacy value elsif self[key].blank? # ignore blank values self.delete(key) else # We use our own Error class to make sure 'send' is not used on error keys. errors.add(key, Property::AttributeError.new(@owner, key, nil, :message => 'property not declared', :value => self[key])) end end missing_keys.each do |key| column = columns[key] if column.has_default? self[key] = column.default_for(@owner) end end keys_to_validate.each do |key| columns[key].validate(self[key], errors) end bad_keys.empty? end