我在我的rails应用程序中使用Mongoid
和rails_admin
gem。这是我的两个模型文件:
模型Category
class Category
include Mongoid::Document
include Mongoid::Timestamps
field :name, type: String
embeds_many :tags
# accepts_nested_attributes_for :tags # this line will be added later
end
模型Tag
class Tag
include Mongoid::Document
field :name, type: String
embedded_in :category
end
当我运行管理页面(由rails_admin
生成)时,我遇到异常。在此例外情况中,有一条消息告诉我,我应该将accepts_nested_attributes_for :tag
放在Category
模型中。放完该行后,不会出现错误。
所以,我的问题是:请为我解释accepts_nested_attributes_for
的目的。我看到很多教程,通常这两行一起使用:
embeds_many :tags
accepts_nested_attributes_for :tags
为什么?为什么不只有一行?
@Edit:我也看过这个链接。但我仍然不太了解。 explanation
谢谢:)
答案 0 :(得分:1)
来自docs
嵌套属性允许您通过父级保存关联记录的属性。默认情况下,嵌套属性更新已关闭,您可以使用#accepts_nested_attributes_for类方法启用它。启用嵌套属性时,将在模型上定义属性编写器。
换句话说,接受嵌套属性允许您直接从类别模型中保存标记(即轨道)
另一方面,embeds_many是添加类别和标签之间的关系(即mongoid)。没有#accepts_nested_attributes它仍然有效,但不允许你从父节点一步保存。
这是一个很好的例子:
在一对一关联上启用嵌套属性允许您一次创建成员和头像:
params = { member: { name: 'Jack', avatar_attributes: { icon: 'smiling' } } }
# both member and avatar passed in one hash
member = Member.create(params[:member])
member.avatar.id # => 2
member.avatar.icon # => 'smiling'
可以找到一个非常好的视频来进一步解释这个概念here