Class: Mongoid::Association::Referenced::HasAndBelongsToMany

Inherits:
Object
  • Object
show all
Includes:
Buildable, Mongoid::Association::Relatable
Defined in:
lib/mongoid/association/referenced/has_and_belongs_to_many.rb,
lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb,
lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb,
lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb,
lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb

Overview

The HasAndBelongsToMany type association.

Defined Under Namespace

Modules: Buildable Classes: Binding, Eager, Proxy

Constant Summary collapse

ASSOCIATION_OPTIONS =

The options available for this type of association, in addition to the common ones.

Returns:

  • (Array<Symbol>)

    The extra valid options.

[
    :after_add,
    :after_remove,
    :autosave,
    :before_add,
    :before_remove,
    :counter_cache,
    :dependent,
    :foreign_key,
    :index,
    :order,
    :primary_key,
    :inverse_primary_key,
    :inverse_foreign_key,
    :scope,
].freeze
VALID_OPTIONS =

The complete list of valid options for this association, including the shared ones.

Returns:

  • (Array<Symbol>)

    The valid options.

(ASSOCIATION_OPTIONS + SHARED_OPTIONS).freeze
FOREIGN_KEY_FIELD_TYPE =

The type of the field holding the foreign key.

Returns:

  • (Array)
Array
FOREIGN_KEY_SUFFIX =

The default foreign key suffix.

Returns:

  • (String)

    ‘_ids’

'_ids'.freeze

Constants included from Mongoid::Association::Relatable

Mongoid::Association::Relatable::PRIMARY_KEY_DEFAULT, Mongoid::Association::Relatable::SHARED_OPTIONS

Instance Attribute Summary

Attributes included from Mongoid::Association::Relatable

#name, #options, #parent_inclusions

Instance Method Summary collapse

Methods included from Buildable

#build

Methods included from Mongoid::Association::Relatable

#==, #counter_cache_column_name, #create_relation, #destructive?, #extension, #foreign_key_check, #foreign_key_setter, #get_callbacks, #in_to?, #initialize, #inverse, #inverse_association, #inverse_class, #inverse_class_name, #inverse_setter, #inverse_type, #inverse_type_setter, #inverses, #key, #many?, #one?, #relation_class, #relation_class_name, #setter, #type_setter, #validate?

Methods included from Options

#as, #autobuilding?, #autosave, #cascading_callbacks?, #counter_cached?, #cyclic?, #dependent, #indexed?, #inverse_of, #order, #polymorphic?, #primary_key, #store_as, #touch_field, #touchable?, #type

Methods included from Constrainable

#convert_to_foreign_key

Instance Method Details

#bindable?(doc) ⇒ true | false

Whether trying to bind an object using this association should raise an error.

Parameters:

  • doc (Document)

    The document to be bound.

Returns:

  • (true | false)

    Whether the document can be bound.



136
137
138
# File 'lib/mongoid/association/referenced/has_and_belongs_to_many.rb', line 136

def bindable?(doc)
  forced_nil_inverse? || (!!inverse && doc.fields.keys.include?(foreign_key))
end

#criteria(base, id_list = nil) ⇒ Mongoid::Criteria

The criteria used for querying this association.

Returns:



110
111
112
# File 'lib/mongoid/association/referenced/has_and_belongs_to_many.rb', line 110

def criteria(base, id_list = nil)
  query_criteria(id_list || base.send(foreign_key))
end

#embedded?false

Is this association type embedded?

Returns:

  • (false)

    Always false.



73
# File 'lib/mongoid/association/referenced/has_and_belongs_to_many.rb', line 73

def embedded?; false; end

#forced_nil_inverse?true | false

Are ids only saved on this side of the association?

Returns:

  • (true | false)

    Whether this association has a forced nil inverse.



83
84
85
# File 'lib/mongoid/association/referenced/has_and_belongs_to_many.rb', line 83

def forced_nil_inverse?
  @forced_nil_inverse ||= @options.key?(:inverse_of) && !@options[:inverse_of]
end

#foreign_keyString

Get the foreign key field for saving the association reference.

Returns:

  • (String)

    The foreign key field for saving the association reference.



102
103
104
105
# File 'lib/mongoid/association/referenced/has_and_belongs_to_many.rb', line 102

def foreign_key
  @foreign_key ||= @options[:foreign_key] ? @options[:foreign_key].to_s :
                     default_foreign_key_field
end

#inverse_foreign_keyString

Get the foreign key field on the inverse.

Returns:

  • (String)

    The foreign key field for saving the association reference on the inverse side.



118
119
120
121
122
123
124
125
126
127
128
# File 'lib/mongoid/association/referenced/has_and_belongs_to_many.rb', line 118

def inverse_foreign_key
  if @options.key?(:inverse_foreign_key)
    @options[:inverse_foreign_key]
  elsif @options.key?(:inverse_of)
    inverse_of ? "#{inverse_of.to_s.singularize}#{FOREIGN_KEY_SUFFIX}" : nil
  elsif inv = inverse_association&.foreign_key
    inv
  else
    "#{inverse_class_name.demodulize.underscore}#{FOREIGN_KEY_SUFFIX}"
  end
end

#inverse_foreign_key_setterString

Get the foreign key setter on the inverse.

Returns:

  • (String)

    The foreign key setter for saving the association reference on the inverse side.



144
145
146
# File 'lib/mongoid/association/referenced/has_and_belongs_to_many.rb', line 144

def inverse_foreign_key_setter
  @inverse_foreign_key_setter ||= "#{inverse_foreign_key}=" if inverse_foreign_key
end

#nested_builder(attributes, options) ⇒ Association::Nested::One

The nested builder object.

Parameters:

  • attributes (Hash)

    The attributes to use to build the association object.

  • options (Hash)

    The options for the association.

Returns:



154
155
156
# File 'lib/mongoid/association/referenced/has_and_belongs_to_many.rb', line 154

def nested_builder(attributes, options)
  Nested::Many.new(self, attributes, options)
end

#path(document) ⇒ Root

Get the path calculator for the supplied document.

Examples:

Get the path calculator.

association.path(document)

Parameters:

  • document (Document)

    The document to calculate on.

Returns:

  • (Root)

    The root atomic path calculator.



166
167
168
# File 'lib/mongoid/association/referenced/has_and_belongs_to_many.rb', line 166

def path(document)
  Mongoid::Atomic::Paths::Root.new(document)
end

#relationAssociation::HasAndBelongsToMany::Proxy

Get the association proxy class for this association type.

Returns:

  • (Association::HasAndBelongsToMany::Proxy)

    The proxy class.



95
96
97
# File 'lib/mongoid/association/referenced/has_and_belongs_to_many.rb', line 95

def relation
  Proxy
end

#relation_complementsArray<Mongoid::Association::Relatable>

The list of association complements.

Returns:



58
59
60
# File 'lib/mongoid/association/referenced/has_and_belongs_to_many.rb', line 58

def relation_complements
  @relation_complements ||= [ self.class ].freeze
end

#scopeProc | Symbol | nil

Get the scope to be applied when querying the association.

Returns:

  • (Proc | Symbol | nil)

    The association scope, if any.



173
174
175
# File 'lib/mongoid/association/referenced/has_and_belongs_to_many.rb', line 173

def scope
  @options[:scope]
end

#setup!self

Setup the instance methods, fields, etc. on the association owning class.

Returns:

  • (self)


65
66
67
68
# File 'lib/mongoid/association/referenced/has_and_belongs_to_many.rb', line 65

def setup!
  setup_instance_methods!
  self
end

#stores_foreign_key?true

Does this association type store the foreign key?

Returns:

  • (true)

    Always true.



90
# File 'lib/mongoid/association/referenced/has_and_belongs_to_many.rb', line 90

def stores_foreign_key?; true; end

#validation_defaultfalse

The default for validation the association object.

Returns:

  • (false)

    Always false.



78
# File 'lib/mongoid/association/referenced/has_and_belongs_to_many.rb', line 78

def validation_default; true; end