Rails: есть ли эквивалент save_without_validation, который пропускает фильтры after_save? - PullRequest
4 голосов
/ 25 ноября 2008

У меня есть фильтр after_save, который я не хочу запускать в конкретном случае. Есть ли способ сделать это похожим на save_without_validation?

Спасибо

Ответы [ 4 ]

1 голос
/ 19 декабря 2010

При использовании rails 2 вы можете вызвать приватный метод create_without_callbacks, выполнив:

@my_obj.send(:create_without_callbacks)
0 голосов
/ 16 декабря 2010

Вы можете установить и сбросить обратные вызовы следующим образом:

  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.

0 голосов
/ 19 декабря 2010

Для Rails 2 вы также можете использовать следующие методы:

create_without_callbacks или update_without_callbacks

0 голосов
/ 25 ноября 2008

Хороший пример расширения 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

Тогда все, что вы делаете внутри блока, не выполняет обратный вызов.

...