class DataMapper::Resource::PersistenceState::Dirty
a persisted/dirty resource
Public Instance Methods
commit()
click to toggle source
# File lib/dm-core/resource/persistence_state/dirty.rb, line 18 def commit remove_from_identity_map set_child_keys return self unless valid_attributes? update_resource reset_original_attributes reset_resource_key Clean.new(resource) ensure add_to_identity_map end
delete()
click to toggle source
# File lib/dm-core/resource/persistence_state/dirty.rb, line 13 def delete reset_resource Deleted.new(resource) end
original_attributes()
click to toggle source
# File lib/dm-core/resource/persistence_state/dirty.rb, line 35 def original_attributes @original_attributes ||= {} end
rollback()
click to toggle source
# File lib/dm-core/resource/persistence_state/dirty.rb, line 30 def rollback reset_resource Clean.new(resource) end
set(subject, value)
click to toggle source
Calls superclass method
# File lib/dm-core/resource/persistence_state/dirty.rb, line 7 def set(subject, value) track(subject, value) super original_attributes.empty? ? Clean.new(resource) : self end
Private Instance Methods
reset_original_attributes()
click to toggle source
# File lib/dm-core/resource/persistence_state/dirty.rb, line 82 def reset_original_attributes original_attributes.clear end
reset_resource()
click to toggle source
# File lib/dm-core/resource/persistence_state/dirty.rb, line 57 def reset_resource reset_resource_properties reset_resource_relationships end
reset_resource_key()
click to toggle source
# File lib/dm-core/resource/persistence_state/dirty.rb, line 62 def reset_resource_key resource.instance_eval { remove_instance_variable(:@_key) } end
reset_resource_properties()
click to toggle source
# File lib/dm-core/resource/persistence_state/dirty.rb, line 66 def reset_resource_properties # delete every original attribute after resetting the resource original_attributes.delete_if do |property, value| property.set!(resource, value) true end end
reset_resource_relationships()
click to toggle source
# File lib/dm-core/resource/persistence_state/dirty.rb, line 74 def reset_resource_relationships relationships.each do |relationship| next unless relationship.loaded?(resource) # TODO: consider a method in Relationship that can reset the relationship resource.instance_eval { remove_instance_variable(relationship.instance_variable_name) } end end
track(subject, value)
click to toggle source
# File lib/dm-core/resource/persistence_state/dirty.rb, line 41 def track(subject, value) if original_attributes.key?(subject) # stop tracking if the new value is the same as the original if original_attributes[subject].eql?(value) original_attributes.delete(subject) end elsif !value.eql?(original = get(subject)) # track the original value original_attributes[subject] = original end end
update_resource()
click to toggle source
# File lib/dm-core/resource/persistence_state/dirty.rb, line 53 def update_resource repository.update(resource.dirty_attributes, collection_for_self) end
valid_attributes?()
click to toggle source
# File lib/dm-core/resource/persistence_state/dirty.rb, line 86 def valid_attributes? original_attributes.each_key do |property| return false if property.kind_of?(Property) && !property.valid?(property.get!(resource)) end true end