2013-05-02 2 views
2

У меня есть следующие модели:Mongoid, называя update_attributes дважды упорствовать Смените

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.

  • Все обратные вызовы прокомментированы.
  • Я тестирую его в консоли рельсов.
  • MongogoDB версия 2.2.3
  • Mongoid версия 2.6.0

Спасибо!

ответ

0

какой уровень безопасности вы используете?

В зависимости от того, как настроить его, 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 

Вы также можете установить уровень безопасности по умолчанию в файле config/mongoid.yml вашего проекта Rails.

Смотрите также:

Значения, которые могут быть переданы с: сейф :

  • true: Сохранение в безопасном режиме, без дополнительных параметров.
  • false: не сохраняются в безопасном режиме.
  • fsync: true | false: выполнять ли fsync.
  • w: n: количество узлов для записи до возврата.
  • wtimeout: n: значение таймаута для записи на несколько узлов.
+0

Спасибо за вашу помощь ... Я получил: 'NoMethodError: неопределенный метод' с»для группы: Class' – cortex

+0

Я использую очень простой mongoid.yml ... хозяин, дб и' use_object_ids: правда ' – cortex

+0

Я пытаюсь' Group.safely ({w: 2, fsync: true}). Create! (Name: 'foo') '=>' Mongo :: OperationFailure:: norepl' – cortex

Смежные вопросы