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