HABTM和accepts_nested_attributes_for

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

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

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

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

accepted_nested_attributes_for适合这个,还是有另一种方式?

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

我不确定为什么这么多人使用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关系,根据需要添加和删除它们。