Module: Mongoid::Association::Referenced::Syncable
- Included in:
- Mongoid::Association
- Defined in:
- lib/mongoid/association/referenced/syncable.rb
Overview
This module handles the behavior for synchronizing foreign keys between both sides of a many to many associations.
Defined Under Namespace
Modules: ClassMethods
Instance Method Summary collapse
-
#_syncable?(association) ⇒ true | false
Is the document able to be synced on the inverse side? This is only if the key has changed and the association bindings have not been run.
-
#_synced ⇒ Hash
Get the synced foreign keys.
-
#_synced?(foreign_key) ⇒ true | false
Has the document been synced for the foreign key?.
-
#remove_inverse_keys(association) ⇒ Object
Update the inverse keys on destroy.
-
#update_inverse_keys(association) ⇒ Object
Update the inverse keys for the association.
Instance Method Details
#_syncable?(association) ⇒ true | false
Is the document able to be synced on the inverse side? This is only if the key has changed and the association bindings have not been run.
21 22 23 |
# File 'lib/mongoid/association/referenced/syncable.rb', line 21 def _syncable?(association) !_synced?(association.foreign_key) && send(association.foreign_key_check) end |
#_synced ⇒ Hash
Get the synced foreign keys.
31 32 33 |
# File 'lib/mongoid/association/referenced/syncable.rb', line 31 def _synced @_synced ||= {} end |
#_synced?(foreign_key) ⇒ true | false
Has the document been synced for the foreign key?
43 44 45 |
# File 'lib/mongoid/association/referenced/syncable.rb', line 43 def _synced?(foreign_key) !!_synced[foreign_key] end |
#remove_inverse_keys(association) ⇒ Object
Update the inverse keys on destroy.
55 56 57 58 59 60 |
# File 'lib/mongoid/association/referenced/syncable.rb', line 55 def remove_inverse_keys(association) foreign_keys = send(association.foreign_key) unless foreign_keys.nil? || foreign_keys.empty? association.criteria(self, foreign_keys).pull(association.inverse_foreign_key => _id) end end |
#update_inverse_keys(association) ⇒ Object
Update the inverse keys for the association.
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
# File 'lib/mongoid/association/referenced/syncable.rb', line 70 def update_inverse_keys(association) if previous_changes.has_key?(association.foreign_key) old, new = previous_changes[association.foreign_key] adds, subs = new - (old || []), (old || []) - new # If we are autosaving we don't want a duplicate to get added - the # $addToSet would run previously and then the $push and $each from the # inverse on the autosave would cause this. We delete each id from # what's in memory in case a mix of id addition and object addition # had occurred. if association.autosave? send(association.name).in_memory.each do |doc| adds.delete_one(doc._id) end end unless adds.empty? association.criteria(self, adds)..add_to_set(association.inverse_foreign_key => _id) end unless subs.empty? association.criteria(self, subs)..pull(association.inverse_foreign_key => _id) end end end |