Подтвердить что ты не робот

Как пропустить обратные вызовы на монгольских документах?

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

4b9b3361

Ответ 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.

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