Module: Mongoid::RelationsDirtyTracking

Extended by:
ActiveSupport::Concern
Defined in:
lib/mongoid/relations_dirty_tracking.rb,
lib/mongoid/relations_dirty_tracking/version.rb,
lib/mongoid/relations_dirty_tracking/versioning.rb

Defined Under Namespace

Modules: ClassMethods, Versioning

Constant Summary collapse

VERSION =
"0.1.0"

Instance Method Summary collapse

Instance Method Details

#changed_with_relations?Boolean

Returns:

  • (Boolean)


51
52
53
# File 'lib/mongoid/relations_dirty_tracking.rb', line 51

def changed_with_relations?
  changed_without_relations? or relations_changed?
end

#changes_with_relationsObject



56
57
58
# File 'lib/mongoid/relations_dirty_tracking.rb', line 56

def changes_with_relations
  (changes_without_relations || {}).merge relation_changes
end

#relation_changesObject



34
35
36
37
38
39
40
41
42
43
# File 'lib/mongoid/relations_dirty_tracking.rb', line 34

def relation_changes
  changes = {}
  @relations_shadow.each_pair do |rel_name, shadow_values|
    current_values = tracked_relation_attributes(rel_name)
    if current_values != shadow_values
      changes[rel_name] = [shadow_values, current_values]
    end
  end
  changes
end

#relations_changed?Boolean

Returns:

  • (Boolean)


46
47
48
# File 'lib/mongoid/relations_dirty_tracking.rb', line 46

def relations_changed?
  !relation_changes.empty?
end

#store_relations_shadowObject



26
27
28
29
30
31
# File 'lib/mongoid/relations_dirty_tracking.rb', line 26

def store_relations_shadow
  @relations_shadow = {}
  self.class.tracked_relations.each do |rel_name|
    @relations_shadow[rel_name] = tracked_relation_attributes(rel_name)
  end
end

#tracked_relation_attributes(rel_name) ⇒ Object



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/mongoid/relations_dirty_tracking.rb', line 61

def tracked_relation_attributes(rel_name)
  rel_name = rel_name.to_s
  values = nil
  if meta = relations[rel_name]
    values = if meta.relation == Mongoid::Relations::Embedded::One
      send(rel_name) && send(rel_name).attributes.clone.delete_if {|key, _| key == 'updated_at' }
    elsif meta.relation == Mongoid::Relations::Embedded::Many
      send(rel_name) && send(rel_name).map {|child| child.attributes.clone.delete_if {|key, _| key == 'updated_at' } }
    elsif meta.relation == Mongoid::Relations::Referenced::One
      send(rel_name) && { "#{meta.key}" => send(rel_name)[meta.key] }
    elsif meta.relation == Mongoid::Relations::Referenced::Many
      send("#{rel_name.singularize}_ids").map {|id| { "#{meta.key}" => id } }
    elsif meta.relation == Mongoid::Relations::Referenced::ManyToMany
      send("#{rel_name.singularize}_ids").map {|id| { "#{meta.primary_key}" => id } }
    elsif meta.relation == Mongoid::Relations::Referenced::In
      send(meta.foreign_key) && { "#{meta.foreign_key}" => send(meta.foreign_key)}
    end
  end
  values
end