how to add records to has_many :through association in rails
I think you can simply do this:
@cust = Customer.new(params[:customer])
@cust.houses << House.find(params[:house_id])
Or when creating a new house for a customer:
@cust = Customer.new(params[:customer])
@cust.houses.create(params[:house])
You can also add via ids:
@cust.house_ids << House.find(params[:house_id])
'The best way' depends on your needs and what feels most comfortable. Confusion comes from differences ActiveRecord's behavior of the new
and create
methods and the <<
operator.
The new
Method
new
will not add an association record for you. You have to build the House
and Agent
records yourself:
house = @cust.houses.new(params[:house])
house.save
agent = Agent(customer_id: @cust.id, house_id: house.id)
agent.save
Note that @cust.houses.new
and House.new
are effectively the same because you need to create the Agent
record in both cases.
The <<
Operator
As Mischa mentions, you can also use the <<
operator on the collection. This will only build the Agent
model for you, you must build the House
model:
house = House.create(params[:house])
@cust.houses << house
agent = @cust.houses.find(house.id)
The create
Method
create
will build both House
and Agent
records for you, but you will need to find the Agent
model if you intend to return that to your view or api:
house = @cust.houses.create(params[:house])
agent = @cust.agents.where(house: house.id).first
As a final note, if you want exceptions to be raised when creating house
use the bang operators instead (e.g. new!
and create!
).