3

此代码中无法更新文档中的数组的错误是什么?

模型

class Foo
  include Mongoid::Document
  include Mongoid::Timestamps::Created

  field :myarray, type: Array

end

控制器

def add_item
        @foo = Foo.find_by(uuid: params[:uuid])
        unless @foo.nil?
            unless @foo.has_attribute? :myarray
                @foo[:myarray] = Array.new
            end
            @foo[:myarray] << params[:item]
            @foo.save
        end
end

我正在使用带有 MongoId 4 的 Rails 4,如果我在看到 @foo 正确更改p @foo之前这样做,但出于任何原因,更新不会持续存在。@foo.save

4

1 回答 1

1

当你这样说时:

@foo[:myarray] << params[:item]

您正在myarray就地修改数组,因此 Mongoid 可能无法识别它已更改。然后当你说 时@foo.save,Mongoid 会看看@foo有什么变化;但是数组引用@foo[:myarray]不会改变,所以 Mongoid 会决定什么都没有改变并且@foo.save不会做任何事情。

如果您通过以下方式强制创建新的数组引用:

@foo[:myarray] += [ params[:item] ] # Or anything else that creates a whole new array

然后 Mongoid 会注意到@foo[:myarray]已更改,并将通过对基础文档的操作@foo.save将更改发送到 MongoDB 。$set

这看起来像 PostgreSQL 数组列的这个 ActiveRecord 问题的 Mongoid 版本:

新数据未保存到 Postgres 上的 Rails 数组列

经验法则是“不要就地编辑可变值,而是创建全新的值:复制、编辑、替换”。这样您就不必担心手动管理“脏”标志。

于 2014-07-21T17:08:37.837 回答