Não consegui encontrar nenhuma documentação sobre o método .build no Rails (atualmente estou usando o 2.0.2).
Por meio da experimentação, parece que você pode usar o método de construção para adicionar um registro a um has_many
relacionamento antes que qualquer registro seja salvo.
Por exemplo:
class Dog < ActiveRecord::Base
has_many :tags
belongs_to :person
end
class Person < ActiveRecord::Base
has_many :dogs
end
# rails c
d = Dog.new
d.tags.build(:number => "123456")
d.save # => true
Isso salvará o cão e a etiqueta com as chaves estrangeiras corretamente. Isso não parece funcionar em um belongs_to
relacionamento.
d = Dog.new
d.person.build # => nil object on nil.build
Eu também tentei
d = Dog.new
d.person = Person.new
d.save # => true
A chave estrangeira Dog
não está definida neste caso devido ao fato de que, no momento em que é salva, a nova pessoa não possui um ID porque ainda não foi salva.
Minhas perguntas são:
Como a construção funciona para que o Rails seja inteligente o suficiente para descobrir como salvar os registros na ordem certa?
Como posso fazer a mesma coisa em um
belongs_to
relacionamento?Onde posso encontrar alguma documentação sobre esse método?
Obrigado
fonte
belongs_to
" e "Métodos adicionados porhas_one
" . Mais documentação técnica pode ser encontrada nos documentos da API:belongs_to
ehas_one
.Respostas:
Onde está documentado:
Na documentação da API sob a associação has_many em " Módulo ActiveRecord :: Associations :: ClassMethods "
A resposta para construir na direção oposta é uma sintaxe ligeiramente alterada. No seu exemplo com os cães,
ou mesmo
Você também pode usar o create_dog para salvá-lo instantaneamente (assim como o método "create" correspondente, que você pode chamar na coleção)
Como os trilhos são inteligentes o suficiente? É mágico (ou mais precisamente, eu simplesmente não sei, adoraria descobrir!)
fonte
find_by_email
efind_by_column_name
métodos. Ele converte o método que você passa para uma string e a disseca e tenta combiná-lo com os nomes das colunas da sua tabela.fonte