【问题标题】:Mongoid, calling update_attributes twice to persist changeMongoid,调用 update_attributes 两次以保持更改
【发布时间】:2013-05-02 21:09:41
【问题描述】:

我有以下型号:

class Group
  ...
  has_many :users, dependent: :delete
  ...
end

class User
  belongs_to :group
  has_one :invitation, dependent: :destroy, foreign_key: 'to_id'

  validates_presence_of :group
end

class Invitation
  belongs_to :to, class_name: "User"

  validates :to, presence: true
end

如果我创建一个新的group = Group.create!(name: 'foo')group.persisted? => true,然后更新一个用户组user.update_attributes!(group: group)

MONGODB (1.4ms) db['system.namespaces'].find({})
MONGODB (13.7ms) db['invitations'].find({"to_id"=>BSON::ObjectId('5170657d627b165f33000002')}).limit(-1).sort([[:_id, :asc]])
MONGODB (204.4ms) db['users'].find({:deleted_at=>nil, "user_id"=>BSON::ObjectId('5170657d627b165f33000002')}).limit(-1).sort([[:_id, :asc]])
MONGODB (1.0ms) db['groups'].find({:deleted_at=>nil, :_id=>BSON::ObjectId('516db306627b164bdb000012'), :_type=>{"$in"=>["Account"]}}).limit(-1).sort([[:_id, :asc]])
MONGODB (183.2ms) db['$cmd'].find({"count"=>"users", "query"=>{:deleted_at=>nil, :slug=>"7d3a-jonathan-grin", :_id=>{"$ne"=>BSON::ObjectId('5170657d627b165f33000002')}}, "fields"=>nil}).limit(-1)
MONGODB (0.2ms) db['users'].update({"_id"=>BSON::ObjectId('5170657d627b165f33000002')}, {"$set"=>{"slug"=>"7d3a-jonathan-grin", "updated_at"=>2013-05-02 20:54:42 UTC}})
=> true

正如你在 Mongoid 日志的最后一句(update 方法)中看到的,该组没有被设置。

如果我再次运行user.update_attributes!(group: group)

MONGODB (132.9ms) db['$cmd'].find({"count"=>"users", "query"=>{:deleted_at=>nil, :slug=>"1e30-jonathan-grin", :_id=>{"$ne"=>BSON::ObjectId('5170657d627b165f33000002')}}, "fields"=>nil}).limit(-1)
MONGODB (0.1ms) db['users'].update({"_id"=>BSON::ObjectId('5170657d627b165f33000002')}, {"$set"=>{"group_id"=>BSON::ObjectId('5182d256218c5a0c8a000004'), "slug"=>"1e30-jonathan-grin", "updated_at"=>2013-05-02 20:56:34 UTC}})
=> true

我只收到两个查询,并且组已更新

group.users << user 也是如此。

  • 所有回调都已注释。
  • 我正在 Rails 控制台中对其进行测试。
  • MongogoDB 2.2.3 版
  • Mongoid 版本 2.6.0

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby mongodb mongoid


    【解决方案1】:

    您使用的是哪个安全级别?

    根据您的配置方式,Mongoid 可能会将更改报告为持久化,而实际上它仅记录在 MongoDB 服务器的内存中 - 尚未持久化到磁盘

    试试这样的:

     Group.with(safe: {w:2,fsync:true}).create!  # requires Mongoid 3.x
    

     Group.safely(w:2, fsync: true).create!   # requires Mongoid 2.x
    

    您还可以在 Rails 项目的 config/mongoid.yml 文件中设置默认安全级别。

    另见:

    可以使用 :safe 传递的值是:

    • true:保持安全模式,没有额外的选项。
    • false:不要坚持安全模式。
    • fsync: true|false: 是否执行fsync。
    • w: n: 返回前要写入的节点数。
    • wtimeout:n:写入多个节点的超时值。

    【讨论】:

    • 感谢您的帮助...我得到了:NoMethodError: undefined method with' for Group:Class`
    • 我正在使用一个非常基本的 mongoid.yml... 主机、数据库和use_object_ids: true
    • 我试试Group.safely({w:2,fsync:true}).create!(name: 'foo') => Mongo::OperationFailure: : norepl
    • 您使用的是哪个 Mongoid 版本?? 3.x 还是 2.x ?
    • MongogoDB 2.2.3 版和 Mongoid 2.6.0 版
    猜你喜欢
    • 2012-11-03
    • 2011-07-06
    • 2016-08-17
    • 2013-01-26
    • 1970-01-01
    • 2011-07-24
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多