Mongoid中的原子持久性与推

时间:2011-05-06 12:58:56

标签: ruby-on-rails ruby mongodb mongoid

我不明白Mongoid的原子方法推动。

我有这个文件:

class Campaign
  include Mongoid::Document

  field :messages, :type => Array # Array of hashes
end

现在在控制台中播放它但消息却没有持续存在。一个例子:

>> campaign = Campaign.last
=> #<Campaign _id: 4dc2b6617e296d53f000000d,...
>> data = {:from => 'user@example.com'}
=> {:from=>"user@example.com"}
>> campaign.push(:messages, data)
=> [{:from=>"user@example.com"}]

日志现在说:

MONGODB blabla_development['campaigns'].update({"_id"=>BSON::ObjectId('4dc2b6617e296d53f000000d')}, {"$push"=>{:messages=>{:from=>"user@example.com"}}})

但如果再次查询此文档,则消息字段为nil:

>> campaign = Campaign.last
=> #<Campaign _id: 4dc2b6617e296d53f000000d,...
>> campaign.messages
=> nil

如何保留此数据?

由于

1 个答案:

答案 0 :(得分:1)

你不是在推送一个数组,而是一个哈希。如果您希望mongodb回答“成功”或“失败”,而不是“确定,无论如何”,请启用安全模式 mongoid (mongomapper)

启用安全模式,试试这个

campaign.safe_mode?(:safe => true) #then carry on. warning, I haven't tested... 

push(... ,:safe => true) #mongomapper

或更改config

persist_in_safe_mode true 
在任何情况下,

在开发环境中都应该是真的。

解决问题:

#to use array instead of hash, do 
data = ["elem1", "elem2"]
#or
campaign.messages << "elem1"
campaign.messages << "elem2"
campaign.save!