2 votes

Mongoid, appel à update_attributes deux fois pour persister le changement

J'ai les modèles suivants :

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

Si je crée un nouveau group = Group.create!(name: 'foo') , group.persisted? => true puis mettre à jour le groupe d'un utilisateur 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

Comme vous pouvez le voir dans la dernière phrase du journal Mongoid ( update ), le groupe n'est pas défini.

Si je cours user.update_attributes!(group: group) une fois de plus :

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

Je n'obtiens que deux requêtes et le le groupe est mis à jour .

Il en va de même pour group.users << user .

  • Tous les rappels sont commentés.
  • Je le teste dans la console rails.
  • MongogoDB version 2.2.3
  • Mongoid version 2.6.0

Merci de votre attention !

0voto

Tilo Points 13833

Quel niveau de sécurité utilisez-vous ?

Selon la façon dont vous le configurez, Mongoid peut signaler une modification comme étant persistante alors qu'elle n'est en fait qu'enregistrée en mémoire sur le serveur MongoDB - et pas encore persistée sur le disque.

Essayez quelque chose comme ceci :

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

o

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

Vous pouvez également définir un niveau de sécurité par défaut dans la rubrique config/mongoid.yml de votre projet Rails.

Voir aussi

Les valeurs qui peuvent être transmises avec :safe sont les suivantes :

  • vrai : Persiste en mode sans échec, sans options supplémentaires.
  • faux : Ne pas persister en mode sans échec.
  • fsync : true|false : Indique s'il faut effectuer un fsync.
  • w : n : Le nombre de nœuds sur lesquels écrire avant de revenir.
  • wtimeout : n : Valeur du délai d'attente pour l'écriture sur plusieurs nœuds.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X