«Лучший способ» зависит от ваших потребностей и того, что вам наиболее удобно. Путаница возникает из-за различий в поведении ActiveRecord методов new
и create
и оператора <<
.
Метод new
new
не добавит запись ассоциации для вас. Вы должны создать записи House
и Agent
самостоятельно:
house = @cust.houses.new(params[:house])
house.save
agent = Agent(customer_id: @cust.id, house_id: house.id)
agent.save
Обратите внимание, что @cust.houses.new
и House.new
фактически одинаковы, потому что вам нужно создать запись Agent
в обоих случаях.
Оператор <<
Как отмечает Миша, вы также можете использовать оператор <<
в коллекции. Это только построит модель Agent
для вас, вы должны построить модель House
:
house = House.create(params[:house])
@cust.houses << house
agent = @cust.houses.find(house.id)
Метод create
create
создаст для вас записи House
и Agent
, но вам нужно будет найти модель Agent
, если вы намереваетесь вернуть ее в ваше представление или API:
house = @cust.houses.create(params[:house])
agent = @cust.agents.where(house: house.id).first
В заключение: если вы хотите, чтобы при создании * 1039 возникали исключения, используйте вместо этого операторы взрыва (например, new!
и create!
).