如何在rails 3.1中为多对多关系保存联合表中的2个id

时间:2012-01-05 02:11:01

标签: ruby-on-rails ruby-on-rails-3.1

有两种型号。一个是rfq,另一个是标准。它就像:

class Rfq << ActiveRecord::Base
  has_and_belongs_to_many :standards
end

class Standard << ActiveRecord::Base
  has_and_belongs_to_many :rfqs
end

表rfqs_standards已创建。我的问题是在创建rfq时,如何自动保存表rfqs_standards中的rfq_id和standard_id的付费。

想在rfq模型中添加accepts_nested_attributes_for :standard。但是,由于没有为这种多对多关系保存的真实属性(但只是一对id),这似乎不是正确的方法。

rfq和standard都在routes.rb中声明为resources :rfqsresources :standards.

程序是在创建rfq时,将通过下拉列表选择标准。然后保存rfq,同时创建联合表中的新条目。创建新标准时,无需在联合表中创建条目。

是否有任何建议将ID保存在联合表中?感谢。

1 个答案:

答案 0 :(得分:1)

这比您想象的要容易,因为它由ActiveRecord自动处理。

当您说“has_and_belongs_to_many”时,您告诉AR使用该表将这两个模型与多对多关系相关联,并且大多数情况下您不再需要担心连接表。当您将标准实例添加到Rfq的标准列表时,这将为您完成。

以下是一个例子:

rfq = Rfq.create
standard = Standard.create
rfq.standards << standard

我们创建了每个对象,第三行创建了连接,使用正确的id在rfqs_standards表中保存了一条新记录。 rqf.standards看起来和行为类似于普通数组,但是当你为它分配对象时,ActiveRecord会让数据库为你工作。

创建记录后,您还可以完成:

standard.rfqs << rfq

你也可以同时做两件事:

rfq = Rfq.create
standard rfq.standards.create

这创建了一个rfq,然后创建了一个自动连接到rfq的标准。你可以反过来做同样的事情:

standard = Standard.create
rfq = standard.rfqs.create

我希望这有帮助!

更新:由于您提到了表单和自动保存,请阅读nested attributes上有关如何实现该文章的文章,包括完整的代码示例。