class Agents << ActiveRecord::Base
belongs_to :customer
belongs_to :house
end
class Customer << ActiveRecord::Base
has_many :agents
has_many :houses, through: :agents
end
class House << ActiveRecord::Base
has_many :agents
has_many :customers, through: :agents
end
Como faço para adicionar ao Agents
modelo para Customer
?
É este o melhor caminho?
Customer.find(1).agents.create(customer_id: 1, house_id: 1)
O procedimento acima funciona bem no console, porém, não sei como fazer isso no aplicativo real.
Imagine que um formulário é preenchido para o cliente e também recebe house_id
como entrada. Então eu faço o seguinte no meu controlador?
def create
@customer = Customer.new(params[:customer])
@customer.agents.create(customer_id: @customer.id, house_id: params[:house_id])
@customer.save
end
No geral, estou confuso sobre como adicionar registros na has_many :through
tabela?
Respostas:
Acho que você pode simplesmente fazer isso:
Ou ao criar uma nova casa para um cliente:
Você também pode adicionar via ids:
fonte
build
istead ofcreate
?<<
operador faz a inserção duas vezes em certos casos. Portanto, ocreate
método é o melhor caminho.'A melhor forma' depende das suas necessidades e do que lhe parece mais confortável. Confusão vem de diferenças comportamento de ActiveRecord do
new
ecreate
métodos eo<<
operador.O
new
métodonew
não adicionará um registro de associação para você. Você deve construir os registrosHouse
eAgent
você mesmo:Observe que
@cust.houses.new
eHouse.new
são efetivamente os mesmos porque você precisa criar oAgent
registro em ambos os casos.O
<<
operadorComo Mischa menciona, você também pode usar o
<<
operador na coleção. Isso só vai construir oAgent
modelo para você, você deve construir oHouse
modelo:O
create
métodocreate
criará os registrosHouse
eAgent
para você, mas você precisará encontrar oAgent
modelo se pretende retorná-lo à sua visualização ou api:Como nota final, se você quiser que exceções sejam levantadas durante a criação,
house
use os operadores de explosão (por exemplo,new!
ecreate!
).fonte
agent = @cust.houses.find(house.id)
lida emagent = @cust.agents.find(house.id)
vez disso? Aagent
variável no "novo método" é diferente daagent
dos últimos exemplos. Pode criar alguma confusão para as pessoas que trabalham com atributos adicionais na tabela de junção.Outra maneira de adicionar associações é usando as colunas de chave estrangeira:
Ou use os nomes exatos das colunas, passando o ID do registro associado em vez do registro.
fonte