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
-
.define_builder!(associação) ➤ Classe
Define um método de construtor para uma associação embeds_one.
-
.define_creater!(associação) ➤ Classe
Define um método criador para uma associação embeds_one.
-
.define_existence_check!(associação) ➤ Classe
Adiciona a verificação de existência para associações.
-
.define_getter!(associação) ➤ Classe
Define o getter para a associação.
-
.define_ids_getter!(associação) ➤ Classe
Define o getter para as IDs dos documentos na associação.
-
.define_ids_setter!(associação) ⇒ Objeto
Define o método setter que permite definir documentos nesta associação por seus IDs.
-
.define_setter!(associação) ➤ Classe
Define o setter para a associação.
Recolhimento do Resumo 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.
-
#create_relation(objeto, associação, campos selecionados = nil) ➤ Proxy
Crie uma associação a partir de um objeto e metadados de associação.
-
#reinício_relation_criteria(nome) ➤ Objeto
Redefine os critérios dentro do proxy de associação.
-
#set_relation(nome, relação) ➤ Proxy
Defina a associação fornecida como uma variável de instância na classe com o nome fornecido.
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.
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, = 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.
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, = 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.
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.
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.
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.
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.
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.
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.
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. 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.
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.
85 86 87 |
# Arquivo 'lib/mongoid/association/accessors.rb', linha 85 def set_relation(name, relação) instance_variable_set("@_#{name}", relação) end |