Module: Mongoid::Relations::Synchronization

Extended by:
ActiveSupport::Concern
Included in:
Mongoid::Relations
Defined in:
lib/mongoid/relations/synchronization.rb

Overview

This module handles the behaviour for synchronizing foreign keys between both sides of a many to many relations.

Defined Under Namespace

Modules: ClassMethods

Instance Method Summary collapse

Instance Method Details

#remove_inverse_keys(meta) ⇒ Object

Update the inverse keys on destroy.

Examples:

Update the inverse keys.

document.remove_inverse_keys()

Parameters:

  • meta (Metadata)

    The document metadata.

Returns:

  • (Object)

    The updated values.

Since:

  • 2.2.1



61
62
63
64
65
66
# File 'lib/mongoid/relations/synchronization.rb', line 61

def remove_inverse_keys(meta)
  foreign_keys = send(meta.foreign_key)
  unless foreign_keys.nil? || foreign_keys.empty?
    meta.criteria(foreign_keys, self.class).pull(meta.inverse_foreign_key => _id)
  end
end

#syncable?(metadata) ⇒ true, false

Is the document able to be synced on the inverse side? This is only if the key has changed and the relation bindings have not been run.

Examples:

Are the foreign keys syncable?

document.syncable?()

Parameters:

  • metadata (Metadata)

    The relation metadata.

Returns:

  • (true, false)

    If we can sync.

Since:

  • 2.1.0



21
22
23
# File 'lib/mongoid/relations/synchronization.rb', line 21

def syncable?()
  !synced?(.foreign_key) && send(.foreign_key_check)
end

#syncedHash

Get the synced foreign keys.

Examples:

Get the synced foreign keys.

document.synced

Returns:

  • (Hash)

    The synced foreign keys.

Since:

  • 2.1.0



33
34
35
# File 'lib/mongoid/relations/synchronization.rb', line 33

def synced
  @synced ||= {}
end

#synced?(foreign_key) ⇒ true, false

Has the document been synced for the foreign key?

Examples:

Has the document been synced?

document.synced?

Parameters:

  • foreign_key (String)

    The foreign key.

Returns:

  • (true, false)

    If we can sync.

Since:

  • 2.1.0



47
48
49
# File 'lib/mongoid/relations/synchronization.rb', line 47

def synced?(foreign_key)
  !!synced[foreign_key]
end

#update_inverse_keys(meta) ⇒ Object

Update the inverse keys for the relation.

Examples:

Update the inverse keys

document.update_inverse_keys()

Parameters:

  • meta (Metadata)

    The document metadata.

Returns:

  • (Object)

    The updated values.

Since:

  • 2.1.0



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/mongoid/relations/synchronization.rb', line 78

def update_inverse_keys(meta)
  if changes.has_key?(meta.foreign_key)
    old, new = changes[meta.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 $pushAll 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 meta.autosave?
      send(meta.name).in_memory.each do |doc|
        adds.delete_one(doc._id)
      end
    end

    unless adds.empty?
      meta.criteria(adds, self.class).without_options.add_to_set(meta.inverse_foreign_key => _id)
    end
    unless subs.empty?
      meta.criteria(subs, self.class).without_options.pull(meta.inverse_foreign_key => _id)
    end
  end
end