Mongoid 4更新文档中的数组属性

时间:2014-07-21 16:27:01

标签: arrays ruby-on-rails-4 mongoid mongoid4

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

模型

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

我正在使用Rails 4和MongoId 4,如果我在p @foo之前@foo.save,我可以看到@foo已正确更改,但由于任何原因,更新不会保留。

1 个答案:

答案 0 :(得分: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会通过基础文档上的$set操作将更改发送到MongoDB。

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

  

New data not persisting to Rails array column on Postgres

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