module Mongoid::RelationsDirtyTracking

Constants

DISABLED_KEY
VERSION

Public Class Methods

disable() { || ... } click to toggle source

Runs a block without invoking relations dirty tracking on the current thread. Returns the block return value.

# File lib/mongoid/relations_dirty_tracking.rb, line 15
def disable
  thread_store[DISABLED_KEY] = true
  yield
ensure
  thread_store[DISABLED_KEY] = false
end
enabled?() click to toggle source

Returns whether relations dirty tracking is enabled on the current thread.

# File lib/mongoid/relations_dirty_tracking.rb, line 23
def enabled?
  !thread_store[DISABLED_KEY]
end

Protected Class Methods

thread_store() click to toggle source
# File lib/mongoid/relations_dirty_tracking.rb, line 29
def thread_store
  defined?(RequestStore) ? RequestStore.store : Thread.current
end

Public Instance Methods

changed_with_relations?() click to toggle source
# File lib/mongoid/relations_dirty_tracking.rb, line 90
def changed_with_relations?
  changed? || relations_changed?
end
changes_with_relations() click to toggle source
# File lib/mongoid/relations_dirty_tracking.rb, line 94
def changes_with_relations
  (changes || {}).merge(relation_changes)
end
relation_changes() click to toggle source
# File lib/mongoid/relations_dirty_tracking.rb, line 76
def relation_changes
  return {} if readonly? || !Mongoid::RelationsDirtyTracking.enabled?
  changes = {}
  @relations_shadow.each_pair do |rel_name, shadow_values|
    current_values = tracked_relation_attributes(rel_name)
    changes[rel_name] = [shadow_values, current_values] if current_values != shadow_values
  end
  changes
end
relations_changed?() click to toggle source
# File lib/mongoid/relations_dirty_tracking.rb, line 86
def relations_changed?
  !relation_changes.empty?
end
store_relations_shadow() click to toggle source
# File lib/mongoid/relations_dirty_tracking.rb, line 68
def store_relations_shadow
  @relations_shadow = {}
  return if readonly? || !Mongoid::RelationsDirtyTracking.enabled?
  self.class.tracked_relations.each do |rel_name|
    @relations_shadow[rel_name] = tracked_relation_attributes(rel_name)
  end
end
tracked_relation_attributes(rel_name) click to toggle source
# File lib/mongoid/relations_dirty_tracking.rb, line 98
def tracked_relation_attributes(rel_name)
  rel_name = rel_name.to_s
  meta = relations[rel_name]
  return nil unless meta
  case meta
  when Mongoid::Association::Embedded::EmbedsOne
    val = send(rel_name)
    val && val.attributes.clone.delete_if { |key, _| key == 'updated_at' }
  when Mongoid::Association::Embedded::EmbedsMany
    val = send(rel_name)
    val && val.map { |child| child.attributes.clone.delete_if { |key, _| key == 'updated_at' } }
  when Mongoid::Association::Referenced::HasOne
    send(rel_name) && { meta.key.to_s => send(rel_name)[meta.key] }
  when Mongoid::Association::Referenced::HasMany
    send(rel_name).map { |child| { meta.key.to_s => child.id } }
  when Mongoid::Association::Referenced::HasAndBelongsToMany
    send(rel_name).map { |child| { meta.primary_key.to_s => child.id } }
  when Mongoid::Association::Referenced::BelongsTo
    begin
      send(meta.foreign_key) && { meta.foreign_key.to_s => send(meta.foreign_key) }
    rescue ActiveModel::MissingAttributeError
      {}
    end
  end
end