2

私は次のモデルを持っています:

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 log ( method ) の最後の文でわかるよう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

クエリは 2 つしか取得できず、グループは更新されます。

で同じことが起こりますgroup.users << user

  • すべてのコールバックはコメントされています。
  • Railsコンソールでテストしています。
  • MongogoDB バージョン 2.2.3
  • Mongoid バージョン 2.6.0

ありがとう!

4

1 に答える 1

0

どの安全レベルを使用していますか?

設定方法によっては、実際には MongoDB サーバーのメモリに記録されているだけで、ディスクにはまだ保存されていないのに、Mongoid が変更を保存済みとして報告する場合があります。

次のようなことを試してください:

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

また

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

config/mongoid.ymlRails プロジェクトのファイルにデフォルトの安全レベルを設定することもできます。

以下も参照してください。

:safe で渡すことができる値は次のとおりです。

  • true: セーフ モードで永続化します。追加のオプションはありません。
  • false: セーフ モードで保持しません。
  • fsync: true|false: fsync を実行するかどうか。
  • w: n: 戻る前に書き込むノードの数。
  • wtimeout: n: 複数ノードへの書き込みのタイムアウト値。
于 2013-05-02T21:15:54.517 に答える