Rails: есть ли аналог save_without_validation, который пропускает фильтры after_save?
У меня есть фильтр after_save, который я не хочу запускать в конкретном случае. Есть ли способ сделать это похожим на save_without_validation?
Спасибо,
4 ответа
При использовании rails 2 вы можете вызвать приватный метод create_without_callbacks
при выполнении:
@my_obj.send(:create_without_callbacks)
Вот хороший пример расширения ActiveRecord для обеспечения пропуска обратного вызова здесь: http://weareintegrum.com/?p=10
Идея состоит в том, чтобы создать метод ActiveRecord с именем skip_callback, который принимает блок:
def self.skip_callback(callback, &block)
method = instance_method(callback)
remove_method(callback) if respond_to?(callback)
define_method(callback){ true }
begin
result = yield
ensure
remove_method(callback)
define_method(callback, method)
end
result
end
Тогда все, что вы делаете внутри блока, не выполняет обратный вызов.
Вы можете установить и сбросить обратные вызовы следующим образом:
Post.after_update.reject! {|callback| callback.method.to_s == 'fancy_callback_on_update' }
Post.after_create.reject! {|callback| callback.method.to_s == 'fancy_callback_on_create' }
Post.after_create :fancy_callback_on_create
Post.after_update :fancy_callback_on_update
Вы можете добавить это вокруг вашего обычая save
метод.
Для Rails 2 вы также можете использовать следующие методы:
create_without_callbacks
или же update_without_callbacks