如何将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对new
和create
方法的不同行为以及<<
运算符。
new
方法
new
不会为您添加关联logging。 你必须自己build立House
和Agent
logging:
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
实际上是相同的,因为您需要在两种情况下创buildAgent
logging。
<<
操作员
正如Mischa提到的,你也可以使用集合上的<<
运算符。 这将只为您build立Agent
模型,您必须build立House
模型:
house = House.create(params[:house]) @cust.houses << house agent = @cust.houses.find(house.id)
create
方法
create
将为您创buildHouse
和Agent
logging,但是如果您打算将其返回给您的视图或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