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 Agentsmodelo 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_idcomo 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 :throughtabla.

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
buildis en lugar decreate?<<operador usa dos veces la inserción en ciertos casos. Entonces elcreatemé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
newycreatemétodos y el<<operador.El
newmétodonewno agregará un registro de asociación por usted. Tienes que crear los registrosHouseyAgenttú mismo:Tenga en cuenta que
@cust.houses.newyHouse.newson efectivamente iguales porque necesita crear elAgentregistro en ambos casos.El
<<operadorComo menciona Mischa, también puede usar el
<<operador en la colección. Esto solo construirá elAgentmodelo para usted, debe construir elHousemodelo:El
createmétodocreateconstruirá ambosHouseyAgentregistros por usted, pero deberá encontrar elAgentmodelo si tiene la intención de devolverlo a su vista o api:Como nota final, si desea que se generen excepciones al crear,
houseutilice 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? Laagentvariable del "nuevo método" es diferente a laagentde 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