我有一个应用程序可以更新帖子(如果存在),否则会创建一个新帖子。这篇文章包含嵌入式文档:
class Post
embeds_one :tag, :as => :taggable, :class_name => 'TagSnippet'
end
class TagSnippet
include Mongoid::Document
field :name
embedded_in :taggable, polymorphic: true
end
使用以下代码在控制器中更新帖子:
@post = Post.where(--some criteria which work--).first
if @post
@post.attributes = params
else
@post = Post.new(params)
end
@post.save!
此代码运行并更新非嵌入文档,但不更新嵌入式文档。奇怪的是,当我在Rubymine中调试时,@post
的所有属性都会适当地改变(包括嵌入的属性),但无论数据库是否都没有更新。
这对我来说这是一个mongo或mongoid问题,但回滚mongo和mongoid宝石没有任何变化。
答案 0 :(得分:3)
我猜您的嵌入式文档定义如下:
field :subdoc, type: Hash
我已经碰过这几次了。简短说明:Mongoid不跟踪subhashes内的变化。
doc.subdoc.field_a = 1 # won't be tracked
sd = doc.subdoc.dup
sd.field_a = 1
doc.subdoc = sd # should be tracked
因此,如果Mongoid没有检测到赋值,则它不会将属性标记为脏,因此不会在更新操作中包含它。
在保存前打印doc.subdoc_changed?
检查此理论。