Module: Mongoid::Relations::Accessors::ClassMethods

Defined in:
lib/mongoid/relations/accessors.rb

Instance Method Summary collapse

Instance Method Details

#existence_check(name, metadata) ⇒ Class

Adds the existence check for relations.

Examples:

Add the existence check.

Person.existence_check(:name, meta)

Check if a relation exists.

person = Person.new
person.has_game?
person.game?

Parameters:

  • name (String, Symbol)

    The name of the relation.

  • The (Metadata)

    metadata.

Returns:

  • (Class)

    The model being set up.

Since:

  • 3.0.0


198
199
200
201
202
203
204
205
206
# File 'lib/mongoid/relations/accessors.rb', line 198

def existence_check(name, )
  module_eval <<-END
    def #{name}?
      without_autobuild { !__send__(:#{name}).blank? }
    end
    alias :has_#{name}? :#{name}?
  END
  self
end

#getter(name, metadata) ⇒ Class

Defines the getter for the relation. Nothing too special here: just return the instance variable for the relation if it exists or build the thing.

Examples:

Set up the getter for the relation.

Person.getter("addresses", )

Parameters:

  • name (String, Symbol)

    The name of the relation.

  • metadata (Metadata)

    The metadata for the relation.

Returns:

  • (Class)

    The class being set up.

Since:

  • 2.0.0.rc.1


221
222
223
224
225
226
# File 'lib/mongoid/relations/accessors.rb', line 221

def getter(name, )
  re_define_method(name) do |reload = false|
    get_relation(name, , reload)
  end
  self
end

#ids_getter(name, metadata) ⇒ Class

Defines the getter for the ids of documents in the relation. Should be specify only for referenced many relations.

Examples:

Set up the ids getter for the relation.

Person.ids_getter("addresses", )

Parameters:

  • name (String, Symbol)

    The name of the relation.

  • metadata (Metadata)

    The metadata for the relation.

Returns:

  • (Class)

    The class being set up.


238
239
240
241
242
243
244
# File 'lib/mongoid/relations/accessors.rb', line 238

def ids_getter(name, )
  ids_method = "#{name.to_s.singularize}_ids"
  re_define_method(ids_method) do
    send(name).only(:id).map(&:id)
  end
  self
end

#ids_setter(name, metadata) ⇒ Object

Defines the setter method that allows you to set documents in this relation by their ids. The defined setter, finds documents with given ids and invokes regular relation setter with found documents. Ids setters should be defined only for referenced many relations.

@param [ String, Symbol ] name The name of the relation.
@param [ Metadata ] metadata The metadata for the relation.

@return [ Class ] The class being set up.

Examples:

Set up the id_setter for the relation.

Person.ids_setter("addesses", )

289
290
291
292
293
294
295
# File 'lib/mongoid/relations/accessors.rb', line 289

def ids_setter(name, )
  ids_method = "#{name.to_s.singularize}_ids="
  re_define_method(ids_method) do |ids|
    send(.setter, .klass.find(ids.reject(&:blank?)))
  end
  self
end

#setter(name, metadata) ⇒ Class

Defines the setter for the relation. This does a few things based on some conditions. If there is an existing association, a target substitution will take place, otherwise a new relation will be created with the supplied target.

Examples:

Set up the setter for the relation.

Person.setter("addresses", )

Parameters:

  • name (String, Symbol)

    The name of the relation.

  • metadata (Metadata)

    The metadata for the relation.

Returns:

  • (Class)

    The class being set up.

Since:

  • 2.0.0.rc.1


261
262
263
264
265
266
267
268
269
270
271
272
273
274
# File 'lib/mongoid/relations/accessors.rb', line 261

def setter(name, )
  re_define_method("#{name}=") do |object|
    without_autobuild do
      if .many?
        set_relation(name, get_relation(name, ).substitute(object.substitutable))
      elsif value = get_relation_for_set(name, , object)
        set_relation(name, value.substitute(object.substitutable))
      else
        __build__(name, object.substitutable, )
      end
    end
  end
  self
end