此代码中无法更新文档中的数组有什么错误?
模型
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已正确更改,但由于任何原因,更新不会保留。
答案 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版本:
经验法则是“不要就地编辑可变值,而是创建全新的值:复制,编辑,替换&#34;”。这样你就不必担心手动管理&#34;脏了&#34;标志。