HABTM和accepts_nested_attributes_for

时间:2011-02-07 17:09:26

标签: ruby-on-rails ruby-on-rails-3

假设我有两个模型,Book和Author,它们之间有has_and_belongs_to_many关系。

我想要做的是能够在书籍表格中添加作者姓名,并在提交时将作者与书籍链接(如果已经存在),或者如果他们不存在则创建它们。

我也想对作者表单做同样的事情:添加书名和提交时如果它们存在则链接它们,或者如果它们不存在则创建它们。

但是,在编辑时,我希望既不能编辑也不能删除嵌套对象,只能删除关联。

accepted_nested_attributes_for是否适用于此,还是有其他方式?

我设法通过跟踪Rails 2上的Complex Forms railscast来实现这一目标,但我正在为Rails 3寻找更优雅的解决方案。

1 个答案:

答案 0 :(得分:12)

我不确定为什么这么多人使用has_and_belongs_to_many,这是Rails 1中的遗物,而不是使用has_many ..., :through,除了它可能在很多旧的参考书和教程中。两种方法的最大区别在于,第一种方法是使用复合键来识别它们,第二种方法是第一类模型。

如果重新定义关系,则可以在中间模型级别进行管理。例如,您可以添加和删除BookAuthor个记录,而不是has_and_belongs_to_many个链接,这些链接很难在个别基础上进行调整。

您可以创建一个简单的模型:

class BookAuthor < ActiveRecord::Base
  belongs_to :book
  belongs_to :author
end

现在,您的其他每个模型都更容易链接:

class Book < ActiveRecord::Base
  has_many :book_authors
  has_many :authors, :through => :book_authors
end

class Author < ActiveRecord::Base
  has_many :book_authors
  has_many :books, :through => :book_authors
end

在您的嵌套表单上,直接管理book_authors关系,根据需要添加和删除它们。