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
如何将Customer
添加到Agents
模型中?
这是最好的办法吗?
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
表中添加记录感到困惑?
3条答案
按热度按时间zwghvu4y1#
我想你可以简单地这样做:
或者在为客户建造新房子时:
您也可以添加通过id:
hsgswve42#
这是一个奇怪的场景,我犹豫了一下,似乎
Agent
应该有许多House
,而不是一对一的关系,一个House
应该只属于一个Agent
。"最佳方法"取决于您的需要以及您感觉最舒适/可读的方法。混淆来自
new
和create
方法以及<<
操作符的ActiveRecord行为的差异,但它们都可以用于实现您的目标。new
方法new
不会为您添加关联记录。您必须自己构建House
和Agent
记录:请注意,
@cust.houses.new
和House.new
实际上是相同的,因为在这两种情况下您仍然需要创建Agent
记录。(This代码看起来很奇怪,你不能很容易地告诉它应该做什么,这是一个气味,也许关系设置错误。)
<<
运算符正如Mischa提到的,你也可以在集合上使用
<<
操作符,这只会为你构建Agent
模型,你必须构建House
模型:create
方法create
将为您构建House
和Agent
记录,但如果您打算将Agent
模型返回到视图或API,则需要找到它:最后要注意的是,如果您希望在创建
house
时引发异常,请改用bang操作符(例如new!
和create!
)。9njqaruj3#
添加关联的另一种方法是使用外键列:
或者使用确切的列名,传递关联记录的ID而不是记录。