Módulo: Mongoid::Association::Accessors

Estendido por:
ActiveSupport::Concern
Incluído em:
Mongoid::Associação
Definido em:
lib/mongoid/association/accessors.rb

Visão geral

Este módulo contém todo o comportamento relacionado ao acesso de associações por meio de getters e setters, e como delegar a construtores para criar novas.

Recolhimento do Resumo do método de classe

Recolhimento do Resumo do método de instância

Detalhes do método de classe

.define_builder!(associação) ⇒ Classe

Define um método de construtor para uma associação embeds_one. Isso é definido como #build_name.

Exemplos:

Person.define_builder!(association)

Parâmetros:

Retorna:

  • (Classe)

    A classe que está sendo configurada.



387
388
389
390
391
392
393
394
395
396
397
398
399
400
# Arquivo 'lib/mongoid/association/accessors.rb', linha 387

def auto.define_builder!(associação)
  name = associação.name
  associação.inverse_class.toque fazer |classe|
    classe.re_define_method("build_#{name}") fazer |*Args|
      attributes, _options = parse_args(*Args)
      documento = Factory.COMPILAR(associação.concern_class, attributes)
      _construção fazer
        criança = enviar("#{name}=", documento)
        criança.run_callbacks(:build)
        criança
      end
    end
  end
end

.define_creater!(associação) ⇒ Classe

Define um método criador para uma associação embeds_one. Isto é definido como #create_name. Depois que o objeto for construído, ele será salvo imediatamente.

Exemplos:

Person.define_creator!(association)

Parâmetros:

Retorna:

  • (Classe)

    A classe que está sendo configurada.



412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
# Arquivo 'lib/mongoid/association/accessors.rb', linha 412

def auto.define_creater!(associação)
  name = associação.name
  associação.inverse_class.toque fazer |classe|
    classe.re_define_method("create_#{name}") fazer |*Args|
      attributes, _options = parse_args(*Args)
      documento = Factory.COMPILAR(associação.classe, attributes)
      doc = _assigning fazer
        enviar("#{name}=", documento)
      end
      doc.Salvar
      Salvar se new_record? && associação.stores_foreign_key?
      doc
    end
  end
end

.define_existence_check!(associação) ➤ Classe

Adiciona a verificação de existência para associações.

Exemplos:

Adicione a verificação de existência.

Person.define_existence_check!(association)

Verifique se existe uma associação.

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

Parâmetros:

Retorna:

  • (Classe)

    O model sendo configurado.



277
278
279
280
281
282
283
284
285
286
287
# Arquivo 'lib/mongoid/association/accessors.rb', linha 277

def auto.define_existence_check!(associação)
  name = associação.name
  associação.inverse_class.toque fazer |classe|
    classe.module_eval <<-END, __FILE__, __LINE__ + 1
        def #{name}? sem_autoconstrução { !__send__(:#{name}).whitef? } fim do alias :has_#{name}? :#{name}?
    END
  end
end

.define_getter!(associação) ➤ Classe

Define o getter para a associação. Nada muito especial aqui: apenas retorne a variável de instância para a associação, se ela existir, ou construa a coisa.

Exemplos:

Configure o getter para a associação.

Person.define_getter!(association)

Parâmetros:

Retorna:

  • (Classe)

    A classe que está sendo configurada.



299
300
301
302
303
304
305
306
307
308
# Arquivo 'lib/mongoid/association/accessors.rb', linha 299

def auto.define_getter!(associação)
  name = associação.name
  associação.inverse_class.toque fazer |classe|
    classe.re_define_method(name) fazer |recarregar = false|
      valor = get_relation(name, associação, nada, recarregar)
      valor = enviar("build_#{name}") se valor.nada? && associação.construção de automóveis? && !sem_autobuild?
      valor
    end
  end
end

.define_ids_getter!(associação) ⇒ Classe

Define o getter para as IDs dos documentos na associação. Deve ser especificado apenas para as muitas associações referenciadas.

Exemplos:

Configure o getter de ids para a associação.

Person.define_ids_getter!(association)

Parâmetros:

Retorna:

  • (Classe)

    A classe que está sendo configurada.



319
320
321
322
323
324
325
326
# Arquivo 'lib/mongoid/association/accessors.rb', linha 319

def auto.define_ids_getter!(associação)
  ids_method = "#{associação.name.to_s.singularize}_ids"
  associação.inverse_class.toque fazer |classe|
    classe.re_define_method(ids_method) fazer
      enviar(associação.name).raspar(:_id)
    end
  end
end

.define_ids_setter!(associação) ⇒ Objeto

Define o método setter que permite definir documentos nesta associação por seus IDs. O setter definido encontra document com os IDs fornecidos e invoca o setter de associação regular com os document encontrados. Os setters de IDs devem ser definidos apenas para as muitas associações referenciadas.

@param [ Mongoid::Association::Relatable ] associação A associação para a associação.

@return [ Class ] A classe que está sendo configurada.

Exemplos:

Configure o id_setter para a associação.

Person.define_ids_setter!(association)


368
369
370
371
372
373
374
375
376
# Arquivo 'lib/mongoid/association/accessors.rb', linha 368

def auto.define_ids_setter!(associação)
  ids_method = "#{associação.name.to_s.singularize}_ids="
  associação.inverse_class.aliased_associations[ids_method.dividir] = associação.name.to_s
  associação.inverse_class.toque fazer |classe|
    classe.re_define_method(ids_method) fazer |ids|
      enviar(associação.setter, associação.concern_class.find(ids.rejeitar(&:blank?)))
    end
  end
end

.define_setter!(associação) ⇒ Classe

Define o setter para a associação. Isso faz algumas coisas com base em algumas condições. Se houver uma associação existente, ocorrerá uma substituição de destino, caso contrário, uma nova associação será criada com o destino fornecido.

Exemplos:

Configure o configurador para a associação.

Person.define_setter!(association)

Parâmetros:

Retorna:

  • (Classe)

    A classe que está sendo configurada.



339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
# Arquivo 'lib/mongoid/association/accessors.rb', linha 339

def auto.define_setter!(associação)
  name = associação.name
  associação.inverse_class.toque fazer |classe|
    classe.re_define_method("#{name}=") fazer |objeto|
      sem_autobuild fazer
        se valor = get_relation(name, associação, objeto)
          valor = __build__(name, valor, associação) a menos que valor.respond_to?(:substitute)

          set_relation(name, valor.substituir(objeto.substituível))
        mais
          __build__(name, objeto.substituível, associação)
        end
      end
    end
  end
end

Detalhes do método de instância

#__build__(name, objeto, connection, updated_fields = nil) ➤ Proxy

Constrói o documento relacionado e cria a associação, a menos que o documento seja nulo, então define a associação neste documento.

Exemplos:

Construa a associação.

person.__build__(:addresses, { :_id => 1 }, association)

Parâmetros:

  • name (string | Símbolo)

    O nome da associação.

  • objeto (Hash | BSON::ObjectId)

    O ID ou atributos a serem usados.

  • associação (Mongoid::Association::Relatable)

    Os metadados da associação.

  • campos_selecionados (Hash) (padrão para: nil)

    Campos que foram recuperados via #only. Se campos selecionados forem especificados, os campos não listados nele não estarão acessíveis no documento criado.

Retorna:

  • (Proxy)

    A associação.



25
26
27
28
# Arquivo 'lib/mongoid/association/accessors.rb', linha 25

def __build__(name, objeto, associação, campos_selecionados = nada)
  relação = create_relation(objeto, associação, campos_selecionados)
  set_relation(name, relação)
end

#create_relation(objeto, associação, campos selecionados = nil) ➤ Proxy

Crie uma associação a partir de um objeto e metadados de associação.

Exemplos:

Crie a associação.

person.create_relation(document, association)

Parâmetros:

  • objeto (Documento | Array <Documento>)

    O alvo da associação.

  • associação (Mongoid::Association::Relatable)

    Os metadados da associação.

  • campos_selecionados (Hash) (padrão para: nil)

    Campos que foram recuperados via #only. Se campos selecionados forem especificados, os campos não listados nele não estarão acessíveis no documento de associação criado.

Retorna:

  • (Proxy)

    A associação.



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# Arquivo 'lib/mongoid/association/accessors.rb', linha 42

def create_relation(objeto, associação, campos_selecionados = nada)
  chave = @attributes[associação.inverse_type]
  type = chave ? associação.resolvedor.model_for(chave) : nada
  Alvo = se t = associação.COMPILAR(auto, objeto, type, campos_selecionados)
             associação.create_relation(auto, t)
           end

  # Só precisa fazer isso em associações incorporadas. As chamadas de resposta pendentes
  # só são adicionados ao materializar os documentos, o que só acontece
  # em associações incorporadas. Não há chamada para o banco de dados de dados no
  # construção de uma associação referenciada.
  se associação.incorporado?
    Array(Alvo).cada fazer |doc|
      doc.tentar(:run_pending_callbacks)
    end
  end

  Alvo
end

#reinício_relation_criteria(nome) ➤ Objeto

Redefine os critérios dentro do proxy de associação. Usado por associações de muitos para muitos para manter a array de ids subjacente sincronizada.

Exemplos:

Redefina os critérios de associação.

person.reset_relation_criteria(:preferences)

Parâmetros:

  • name (Símbolo)

    O nome da associação.



69
70
71
72
73
# Arquivo 'lib/mongoid/association/accessors.rb', linha 69

def reinício_relation_criteria(name)
  Método a menos que instance_variable_definido?("@_#{name}")

  enviar(name).reinício_unloaded
end

#set_relation(nome, relação) ➤ Proxy

Defina a associação fornecida como uma variável de instância na classe com o nome fornecido. Usado como assistente apenas para limpeza do código.

Exemplos:

Defina o proxy no documento.

person.set(:addresses, addresses)

Parâmetros:

  • name (string | Símbolo)

    O nome da associação.

  • relação (Proxy)

    A associação a ser definida.

Retorna:

  • (Proxy)

    A associação.



85
86
87
# Arquivo 'lib/mongoid/association/accessors.rb', linha 85

def set_relation(name, relação)
  instance_variable_set("@_#{name}", relação)
end