class Mongoid::Relations::Bindings::Referenced::ManyToMany

Binding class for all references_and_referenced_in_many relations.

Public Instance Methods

bind_one(doc) click to toggle source

Binds a single document with the inverse relation. Used specifically when appending to the proxy.

@example Bind one document.

person.preferences.bind_one(preference)

@param [ Document ] doc The single document to bind.

@since 2.0.0.rc.1

# File lib/mongoid/relations/bindings/referenced/many_to_many.rb, line 19
def bind_one(doc)
  binding do
    inverse_keys = doc.you_must(metadata.inverse_foreign_key)
    if inverse_keys
      record_id = inverse_record_id(doc)
      unless inverse_keys.include?(record_id)
        doc.you_must(metadata.inverse_foreign_key_setter, inverse_keys.push(record_id))
      end
      doc.reset_relation_criteria(metadata.inverse)
    end
    base.synced[metadata.foreign_key] = true
    doc.synced[metadata.inverse_foreign_key] = true
  end
end
determine_inverse_metadata(doc) click to toggle source
# File lib/mongoid/relations/bindings/referenced/many_to_many.rb, line 63
def determine_inverse_metadata(doc)
  doc.relations[base.class.name.demodulize.underscore.pluralize]
end
inverse_record_id(doc) click to toggle source

Find the inverse id referenced by inverse_keys

# File lib/mongoid/relations/bindings/referenced/many_to_many.rb, line 54
def inverse_record_id(doc)
  inverse_metadata = determine_inverse_metadata(doc)
  if inverse_metadata
    base.__send__(inverse_metadata.primary_key)
  else
    base._id
  end
end
unbind_one(doc) click to toggle source

Unbind a single document.

@example Unbind the document.

person.preferences.unbind_one(document)

@since 2.0.0.rc.1

# File lib/mongoid/relations/bindings/referenced/many_to_many.rb, line 40
def unbind_one(doc)
  binding do
    base.send(metadata.foreign_key).delete_one(record_id(doc))
    inverse_keys = doc.you_must(metadata.inverse_foreign_key)
    if inverse_keys
      inverse_keys.delete_one(inverse_record_id(doc))
      doc.reset_relation_criteria(metadata.inverse)
    end
    base.synced[metadata.foreign_key] = true
    doc.synced[metadata.inverse_foreign_key] = true
  end
end