class Hotel
include Mongoid::Document
field :title, type: String
embeds_many :comments
end
class Comment
include Mongoid::Document
field :text, type: String
belongs_to :hotel
validates :text, presence: true
end
h = Hotel.create('hotel')
=> <#Hotel _id: 52d68dd47361731d8b000000, title: "hotel">
c = Comment.new(text: 'text')
=> <#Comment _id: 52d68f3d7361731d8b040000, text: "text", hotel_id: nil>
h.comments << c
=> [#<Comment _id: 52d68f3d7361731d8b040000, text: "text", hotel_id: nil>]
h.save
=> true
Hotel.last.comments
=> []
变体2
h.comments << Comment.new(text: 'new', hotel_id: h.id)
=> [<#Comment _id: 52d68f3d7361731d8b040000, text: "text", hotel_id: nil>, <#Comment _id: 52d691e17361731d8b050000, text: "new", hotel_id: BSON::ObjectId('52d68dd47361731d8b000000')>]
h.save
=> true
Hotel.last.comments
=> []
最佳答案
我看到两个可能的问题:
Hotel.last
不一定Hotel
52d68dd47361731d8b000000。你应该看看h.comments
或偏执,h.reload
和 h.comments
. 来自 fine manual :
Embedded 1-n
One to many relationships where the children are embedded in the parent document are defined using Mongoid's
embeds_many
andembedded_in
macros.Defining
The parent document of the relation should use the
embeds_many
macro to indicate it has n number of embedded children, where the document that is embedded usesembedded_in
.
所以你的关系应该这样定义:
class Hotel
embeds_many :comments
end
class Comment
embedded_in :hotel
end
您正在使用
belongs_to: hotel
在 Comment
什么时候该说 embedded_in :hotel
.文档还说:
Definitions are required on both sides to the relation in order for it to work properly.
并且您的关系在一侧配置不正确,因此无法正常工作。
关于ruby-on-rails - 如何在 Mongoid 中保存 embeds_many 关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21139354/