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
Как добавить в Agents
модель для Customer
?
Это лучший способ?
Customer.find(1).agents.create(customer_id: 1, house_id: 1)
Вышеупомянутое отлично работает с консоли, однако я не знаю, как этого добиться в реальном приложении.
Представьте, что для клиента заполняется форма, которая также используется в house_id
качестве входных данных. Тогда что я должен делать в своем контроллере?
def create
@customer = Customer.new(params[:customer])
@customer.agents.create(customer_id: @customer.id, house_id: params[:house_id])
@customer.save
end
В целом я не понимаю, как добавлять записи в has_many :through
таблицу?
Ответы:
Я думаю, вы можете просто сделать это:
Или при создании нового дома для заказчика:
Вы также можете добавить через идентификаторы:
источник
build
istead ofcreate
?<<
в некоторых случаях оператор using выполняет вставку дважды. Так чтоcreate
метод - лучший способ.«Лучший способ» зависит от ваших потребностей и от того, что вам удобнее всего. Путаница происходит от различия поведения ActiveRecord портретируемого ,
new
иcreate
методов и<<
оператора.new
Методnew
не будет добавлять за вас запись ассоциации. Вы должны сами построитьHouse
иAgent
записать:Обратите внимание, что
@cust.houses.new
иHouse.new
фактически одно и то же, потому что вам нужно создатьAgent
запись в обоих случаях.<<
ОператорКак упоминает Миша, вы также можете использовать
<<
оператор в коллекции. Это только построитAgent
модель для вас, вы должны построитьHouse
модель:create
Методcreate
будет строить какHouse
иAgent
запись для вас, но вам нужно будет найтиAgent
модель , если вы намерены вернуться , что на ваш взгляд или API:В заключение, если вы хотите, чтобы при создании возникали исключения,
house
используйте вместо этого операторы взрыва (например,new!
иcreate!
).источник
agent = @cust.houses.find(house.id)
читать строкуagent = @cust.agents.find(house.id)
вместо этого?agent
Переменной в «новом методе» отличается отagent
в последних примерах. Может создать некоторую путаницу для людей, работающих с дополнительными атрибутами в соединительной таблице.Другой способ добавить ассоциации - использовать столбцы внешнего ключа:
Или используйте точные имена столбцов, передав идентификатор связанной записи вместо записи.
источник