Class: Mongoid::Association::Referenced::HasAndBelongsToMany::Binding
- Inherits:
-
Object
- Object
- Mongoid::Association::Referenced::HasAndBelongsToMany::Binding
- Includes:
- Bindable
- Defined in:
- lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb
Overview
Binding class for all has_and_belongs_to_many associations.
Instance Attribute Summary
Attributes included from Bindable
#_association, #_base, #_target
Instance Method Summary collapse
-
#bind_one(doc) ⇒ Object
Binds a single document with the inverse association.
-
#determine_inverse_association(doc) ⇒ Mongoid::Association::Relatable
Find the inverse association given a document.
-
#inverse_record_id(doc) ⇒ BSON::ObjectId
Find the inverse id referenced by inverse_keys.
-
#unbind_one(doc) ⇒ Object
Unbind a single document.
Methods included from Bindable
Instance Method Details
#bind_one(doc) ⇒ Object
Binds a single document with the inverse association. Used specifically when appending to the proxy.
20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
# File 'lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb', line 20 def bind_one(doc) binding do inverse_keys = try_method(doc, _association.inverse_foreign_key) unless doc.frozen? if inverse_keys record_id = inverse_record_id(doc) unless inverse_keys.include?(record_id) try_method(doc, _association.inverse_foreign_key_setter, inverse_keys.push(record_id)) end doc.reset_relation_criteria(_association.inverse) end _base._synced[_association.foreign_key] = true doc._synced[_association.inverse_foreign_key] = true end end |
#determine_inverse_association(doc) ⇒ Mongoid::Association::Relatable
Find the inverse association given a document.
77 78 79 |
# File 'lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb', line 77 def determine_inverse_association(doc) doc.relations[_base.class.name.demodulize.underscore.pluralize] end |
#inverse_record_id(doc) ⇒ BSON::ObjectId
Find the inverse id referenced by inverse_keys
58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb', line 58 def inverse_record_id(doc) if pk = _association.[:inverse_primary_key] _base.send(pk) else inverse_association = determine_inverse_association(doc) if inverse_association _base.__send__(inverse_association.primary_key) else _base._id end end end |
#unbind_one(doc) ⇒ Object
Unbind a single document.
39 40 41 42 43 44 45 46 47 48 49 50 |
# File 'lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb', line 39 def unbind_one(doc) binding do _base.send(_association.foreign_key).delete_one(record_id(doc)) inverse_keys = try_method(doc, _association.inverse_foreign_key) unless doc.frozen? if inverse_keys inverse_keys.delete_one(inverse_record_id(doc)) doc.reset_relation_criteria(_association.inverse) end _base._synced[_association.foreign_key] = true doc._synced[_association.inverse_foreign_key] = true end end |