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

有两种型号。 一个是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的建议吗? 谢谢。

这比你想象的要容易,因为它是由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 

我希望这有帮助!

更新:由于您提到了表单和自动保存,请阅读我的关于嵌套属性的文章,该文章展示了如何实现它,包括完整的代码示例。