Mongo / Mongoid将创建但不更新模型

时间:2012-03-30 17:46:44

标签: ruby-on-rails mongodb mongoid

我有一个应用程序可以更新帖子(如果存在),否则会创建一个新帖子。这篇文章包含嵌入式文档:

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宝石没有任何变化。

1 个答案:

答案 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?检查此理论。