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