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
¿Cómo agrego al Agents
modelo para Customer
?
Es esta la mejor manera?
Customer.find(1).agents.create(customer_id: 1, house_id: 1)
Lo anterior funciona bien desde la consola, sin embargo, no sé cómo lograrlo en la aplicación real.
Imagine que se llena un formulario para el cliente que también lo toma house_id
como entrada. Entonces, ¿hago lo siguiente en mi controlador?
def create
@customer = Customer.new(params[:customer])
@customer.agents.create(customer_id: @customer.id, house_id: params[:house_id])
@customer.save
end
En general, estoy confundido sobre cómo agregar registros en la has_many :through
tabla.
Respuestas:
Creo que simplemente puedes hacer esto:
O al crear una nueva casa para un cliente:
También puede agregar a través de identificadores:
fuente
build
is en lugar decreate
?<<
operador usa dos veces la inserción en ciertos casos. Entonces elcreate
método es la mejor manera."La mejor manera" depende de sus necesidades y de lo que le resulte más cómodo. La confusión proviene de las diferencias de comportamiento de la ActiveRecord
new
ycreate
métodos y el<<
operador.El
new
métodonew
no agregará un registro de asociación por usted. Tienes que crear los registrosHouse
yAgent
tú mismo:Tenga en cuenta que
@cust.houses.new
yHouse.new
son efectivamente iguales porque necesita crear elAgent
registro en ambos casos.El
<<
operadorComo menciona Mischa, también puede usar el
<<
operador en la colección. Esto solo construirá elAgent
modelo para usted, debe construir elHouse
modelo:El
create
métodocreate
construirá ambosHouse
yAgent
registros por usted, pero deberá encontrar elAgent
modelo si tiene la intención de devolverlo a su vista o api:Como nota final, si desea que se generen excepciones al crear,
house
utilice los operadores bang en su lugar (por ejemplo,new!
ycreate!
).fuente
agent = @cust.houses.find(house.id)
leerse la línea en suagent = @cust.agents.find(house.id)
lugar? Laagent
variable del "nuevo método" es diferente a laagent
de los últimos ejemplos. Puede crear cierta confusión para las personas que trabajan con atributos adicionales en la tabla de combinación.Otra forma de agregar asociaciones es usando las columnas de clave externa:
O utilice los nombres exactos de las columnas, pasando el ID del registro asociado en lugar del registro.
fuente