Как пропустить обратные вызовы на Mongoid Документы? - PullRequest
19 голосов
/ 15 июня 2010

Мой вопрос похож на этот Как пропустить обратные вызовы ActiveRecord? но вместо AR я использую Mongoid, кажется, что это еще не реализовано в текущей версии Mongoid, поэтому яХотелось бы узнать, какое должно быть элегантное решение для его реализации.(при необходимости).

Ответы [ 5 ]

31 голосов
/ 13 октября 2010

Да, вы можете!

Mongoid построен на ActiveModel, а ActiveModel имеет функцию skip_callback . Вы можете использовать skip_callback так:

# skip the callback
MyModelClass.skip_callback(:save, :before, :ensure_foo_is_not_bar)

my_model_instance.update_attributes :foo => 'bar'

# restore the callback for future calls
MyModelClass.set_callback(:save, :before, :ensure_foo_is_not_bar)

Я использую это без проблем в большом приложении. Для получения дополнительной информации см. Это сообщение в блоге Джефф Kreeftmeijer:

http://jeffkreeftmeijer.com/2010/disabling-activemodel-callbacks/

18 голосов
/ 13 сентября 2012

Может быть проще использовать моноидные атомарные операции (set, unset и т. Д.):

http://mongoid.org/en/mongoid/docs/persistence.html#atomic

Они не запускают обратные вызовы.

Редактировать:Mongoid 3 говорит, что они не запускают обратные вызовы.Я вижу их обратные вызовы в Mongoid 2, хотя.Так что YMMV

11 голосов
/ 19 июня 2015

В итоге я воспользовался предложением Брайана Армстронга и просто позвонил

person.set(name:"Robert Pulson")

в моем обратном вызове после сохранения.

3 голосов
/ 07 января 2013

Часто это происходит, когда вы хотите выполнить обновление, не вызывая все обратные вызовы для большого объема элементов. Это можно сделать, спустившись к водителю:

Замена 'foo' на 'bar' в поле 'x'.

User.all.each do |u|
  User.collection.where({ _id: u.id }).update({ 
    "$set" => { :x => u.x.gsub('foo', 'bar') 
  })
end
1 голос
/ 15 июня 2010

Я ищу по коду.И нет способа избежать обратного вызова в Mongoid.В обеих версиях 1.9 и 2.0.

Вам необходимо сделать исправление или запрос функции.

...