Class: Datamappify::Repository::UnitOfWork::PersistentStates::Object

Inherits:
Object
  • Object
show all
Includes:
ActiveModel::Dirty
Defined in:
lib/datamappify/repository/unit_of_work/persistent_states/object.rb

Overview

an object that mirrors an entity’s attributes and their initial (clean) values

Instance Method Summary collapse

Constructor Details

#initialize(entity) ⇒ Object

Returns a new instance of Object.

Parameters:



10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/datamappify/repository/unit_of_work/persistent_states/object.rb', line 10

def initialize(entity)
  @entity = entity

  attributes = attributes_for(@entity)
  attributes.each do |name, value|
    construct_attribute(name)
    set_value(name, value)
  end

  self.class.define_attribute_methods(attributes.keys)

  mark_as_dirty if new?
end

Instance Method Details

#attributes_for(entity) ⇒ Hash (private)

Entity attributes, based on whether the entity is lazy loaded

Parameters:

Returns:

  • (Hash)


120
121
122
# File 'lib/datamappify/repository/unit_of_work/persistent_states/object.rb', line 120

def attributes_for(entity)
  entity.lazy_loaded? ? entity.cached_attributes : entity.attributes
end

#construct_attribute(name) ⇒ void (private)

This method returns an undefined value.

Constructs an attribute with a getter, setter and ‘_changed?’ method



62
63
64
65
66
# File 'lib/datamappify/repository/unit_of_work/persistent_states/object.rb', line 62

def construct_attribute(name)
  construct_getter(name)
  construct_setter(name)
  construct_changed(name)
end

#construct_changed(name) ⇒ void (private)

This method returns an undefined value.

Constructs the ‘attr_changed?` method

Parameters:

  • name (Symbol)


98
99
100
101
102
# File 'lib/datamappify/repository/unit_of_work/persistent_states/object.rb', line 98

def construct_changed(name)
  define_singleton_method "#{name}_changed?" do
    changed_attributes.include?(name)
  end
end

#construct_getter(name) ⇒ void (private)

This method returns an undefined value.

Constructs an attribute getter

Parameters:

  • name (Symbol)


73
74
75
76
77
# File 'lib/datamappify/repository/unit_of_work/persistent_states/object.rb', line 73

def construct_getter(name)
  define_singleton_method name do
    instance_variable_get "@#{name}"
  end
end

#construct_setter(name) ⇒ void (private)

This method returns an undefined value.

Constructs an attribute setter, the setter itself does NOT need to set the value as the value is never going to be used.

The setter sets the ‘attr_will_change!` flag when necessary.

Parameters:

  • name (Symbol)


87
88
89
90
91
# File 'lib/datamappify/repository/unit_of_work/persistent_states/object.rb', line 87

def construct_setter(name)
  define_singleton_method "#{name}=" do |value|
    send(:attribute_will_change!, name) unless send(name) == value
  end
end

#mark_as_dirty(*attributes) ⇒ void

This method returns an undefined value.

Mark selected or all attributes as dirty, useful for a non-persisted object or for manually trigger attributes update

Parameters:

  • attrs (Symbol)

    An array or a hash of which the keys are attribute symbols



43
44
45
46
47
48
# File 'lib/datamappify/repository/unit_of_work/persistent_states/object.rb', line 43

def mark_as_dirty(*attributes)
  attributes = attributes.any? ? attributes : attributes_for(@entity)
  attributes.each do |name, _|
    send(:attribute_will_change!, name)
  end
end

#new?Boolean

Is the object new (not persisted yet)?

Returns:

  • (Boolean)


53
54
55
# File 'lib/datamappify/repository/unit_of_work/persistent_states/object.rb', line 53

def new?
  @entity.id.nil?
end

#set_value(name, value) ⇒ any (private)

Sets an attribute value by making a copy of the data

Parameters:

  • name (Symbol)
  • value (any)

Returns:

  • (any)


111
112
113
# File 'lib/datamappify/repository/unit_of_work/persistent_states/object.rb', line 111

def set_value(name, value)
  instance_variable_set "@#{name}", Marshal.load(Marshal.dump(value))
end

#update_values(entity) ⇒ void

This method returns an undefined value.

Updates all the attribute values according to the entity

Parameters:



29
30
31
32
33
34
# File 'lib/datamappify/repository/unit_of_work/persistent_states/object.rb', line 29

def update_values(entity)
  attributes_for(entity).each do |name, value|
    construct_attribute(name)
    send("#{name}=", value)
  end
end