Мой вопрос похож на этот Как пропустить обратные вызовы ActiveRecord?, но вместо AR я использую Mongoid, похоже, что это еще не реализовано в текущая версия Mongoid, поэтому я хотел бы знать, что должно быть изящным решением для ее реализации. (при необходимости).
Как пропустить обратные вызовы на монгольских документах?
Ответ 1
Да, вы можете!
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)
Я использую это без помех в большом приложении. Для получения дополнительной информации см. Это сообщение в блоге Джеффом Крифмайером:
http://jeffkreeftmeijer.com/2010/disabling-activemodel-callbacks/
Ответ 2
Возможно, было бы проще использовать атомные операции Mongoid (установить, отключить и т.д.):
http://mongoid.org/en/mongoid/docs/persistence.html#atomic
Они не запускают обратные вызовы.
Изменить: Mongoid 3 говорит, что они не запускают обратные вызовы. Тем не менее, я вижу их обратные вызовы огня в Mongoid 2. Итак, YMMV
Ответ 3
В итоге я использовал предложение Брайана Армстронга и просто позвонил
person.set(name:"Robert Pulson")
в моем обратном вызове после сохранения.
Ответ 4
Часто это возникает, когда вы хотите сделать обновление без увольнения всех обратных вызовов на большом количестве элементов. Это можно сделать, спустившись к драйверу:
Замена "foo" на "bar" в поле "x".
User.all.each do |u|
User.collection.where({ _id: u.id }).update({
"$set" => { :x => u.x.gsub('foo', 'bar')
})
end
Ответ 5
Я ищу код. И нет возможности избежать обратного вызова в Mongoid. В версиях 1.9 и 2.0.
Вам нужно сделать патч или запрос функции об этом.