如何将logging添加到has_many:通过rails中的关联

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作为input。 那么我在我的控制器中执行以下操作?

 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添加logginghas_many :through表?

我想你可以简单地做到这一点:

  @cust = Customer.new(params[:customer]) @cust.houses << House.find(params[:house_id]) 

或者为客户创build新房子时:

  @cust = Customer.new(params[:customer]) @cust.houses.create(params[:house]) 

“最好的方式”取决于你的需求和最舒适的感觉。 混淆来自于ActiveRecord对newcreate方法的不同行为以及<<运算符。

new方法

new不会为您添加关联logging。 你必须自己build立HouseAgentlogging:

 house = @cust.houses.new(params[:house]) house.save agent = Agent(customer_id: @cust.id, house_id: house.id) agent.save 

请注意, @cust.houses.newHouse.new实际上是相同的,因为您需要在两种情况下创buildAgentlogging。

<<操作员

正如Mischa提到的,你也可以使用集合上的<<运算符。 这将只为您build立Agent模型,您必须build立House模型:

 house = House.create(params[:house]) @cust.houses << house agent = @cust.houses.find(house.id) 

create方法

create将为您创buildHouseAgentlogging,但是如果您打算将其返回给您的视图或API,则需要查找Agent模型:

 house = @cust.houses.create(params[:house]) agent = @cust.agents.where(house: house.id).first 

最后要说明的是,如果您希望在创buildhouse时引发exception情况,请使用“爆炸”运算符(例如new!create! )。

另一种添加关联的方法是使用外键列:

 agent = Agent.new(...) agent.house = House.find(...) agent.customer = Customer.find(...) agent.save 

或者使用确切的列名称,传递相关logging的ID而不是logging。

 agent.house_id = house.id agent.customer_id = customer.id