假设我有两个模型,Book和Author,它们之间有has_and_belongs_to_many关系。
我想要做的是能够在书籍表格中添加作者姓名,并在提交时将作者与书籍链接(如果已经存在),或者如果他们不存在则创建它们。
我也想对作者表单做同样的事情:添加书名和提交时如果它们存在则链接它们,或者如果它们不存在则创建它们。
但是,在编辑时,我希望既不能编辑也不能删除嵌套对象,只能删除关联。
accepted_nested_attributes_for是否适用于此,还是有其他方式?
我设法通过跟踪Rails 2上的Complex Forms railscast来实现这一目标,但我正在为Rails 3寻找更优雅的解决方案。
答案 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
关系,根据需要添加和删除它们。