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

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

Instance Method Summary collapse

Instance Method Details

#existence_check(name) ⇒ 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.

Returns:

  • (Class)

    The model being set up.

Since:

  • 3.0.0



162
163
164
165
166
167
168
169
170
# File 'lib/mongoid/relations/accessors.rb', line 162

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



185
186
187
188
189
190
191
192
193
194
# File 'lib/mongoid/relations/accessors.rb', line 185

def getter(name, )
  re_define_method(name) do |reload = false|
    value = get_relation(name, , nil, reload)
    if value.nil? && .autobuilding? && !without_autobuild?
      value = send("build_#{name}")
    end
    value
  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.

Returns:

  • (Class)

    The class being set up.



205
206
207
208
209
210
211
# File 'lib/mongoid/relations/accessors.rb', line 205

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", )


253
254
255
256
257
258
259
# File 'lib/mongoid/relations/accessors.rb', line 253

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



227
228
229
230
231
232
233
234
235
236
237
238
# File 'lib/mongoid/relations/accessors.rb', line 227

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