ruby-on-rails 如何添加记录到has_many:通过rails中的关联

zvokhttg  于 2022-12-27  发布在  Ruby
关注(0)|答案(3)|浏览(183)
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表中添加记录感到困惑?

zwghvu4y

zwghvu4y1#

我想你可以简单地这样做:

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

或者在为客户建造新房子时:

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

您也可以添加通过id:

@cust.house_ids << House.find(params[:house_id])
hsgswve4

hsgswve42#

    • 前言**

这是一个奇怪的场景,我犹豫了一下,似乎Agent应该有许多House,而不是一对一的关系,一个House应该只属于一个Agent
"最佳方法"取决于您的需要以及您感觉最舒适/可读的方法。混淆来自newcreate方法以及<<操作符的ActiveRecord行为的差异,但它们都可以用于实现您的目标。

new方法

new不会为您添加关联记录。您必须自己构建HouseAgent记录:

# ...
house = @cust.houses.new(params[:house])
house.save
agent = Agent.new(customer: @cust house: house)
agent.save

请注意,@cust.houses.newHouse.new实际上是相同的,因为在这两种情况下您仍然需要创建Agent记录。
(This代码看起来很奇怪,你不能很容易地告诉它应该做什么,这是一个气味,也许关系设置错误。)

<<运算符

正如Mischa提到的,你也可以在集合上使用<<操作符,这只会为你构建Agent模型,你必须构建House模型:

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

create方法

create将为您构建HouseAgent记录,但如果您打算将Agent模型返回到视图或API,则需要找到它:

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

最后要注意的是,如果您希望在创建house时引发异常,请改用bang操作符(例如new!create!)。

9njqaruj

9njqaruj3#

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

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

或者使用确切的列名,传递关联记录的ID而不是记录。

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

相关问题