Как пропустить обратные вызовы ActiveRecord? [дубликат]


Возможные Дубликаты:
как я могу избежать запуска ActiveRecord обратных вызовов?

у меня есть такая модель

class Vote < ActiveRecord::Base  
    after_save :add_points_to_user

    .....
end

можно ли как-то заставить модель пропустить вызов add_points_to_user при сохранении? Возможно, что-то вроде ActiveRecord#delete vs ActiveRecord#destroy?

4 66

4 ответа:

для рельсов 2, но не рельсы 3, Вы можете использовать эти:

object.send(:create_without_callbacks)
object.send(:update_without_callbacks)

Для Рельсов 3, ActiveSupport::Обратные Вызовы дает вам необходимый контроль. Я просто столкнулся с той же проблемой в сценарии интеграции данных, где обычно желательные обратные вызовы должны быть отброшены. Вы можете reset_callbacks En-masse, или использовать skip_callback, чтобы отключить разумно, например:

Vote.skip_callback(:save, :after, :add_points_to_user)

..после чего вы можете работать с экземплярами голосования с помощью: add_points_to_user inhibited

следующее относится к рельсам 2, рельсам 3 и рельсам 4:

http://guides.rubyonrails.org/v3.2.13/active_record_validations_callbacks.html#skipping-callbacks

Он предоставляет список методов, которые пропускают обратные вызовы, объясняя, почему опасно использовать их без тщательного рассмотрения. Переиздано здесь в соответствии с положениями лицензии Creative Commons Attribution-Share Alike 3.0.

12 вприпрыжку Обратные вызовы

Так же, как и при проверке, можно также пропустить обратные вызовы. Эти методы следует использовать с осторожностью, однако, потому что важно бизнес-правила и логика приложения могут храниться в обратных вызовах. Обход их без понимания потенциальных последствий может приведите к неверным данным.

  • декремента
  • decrement_counter
  • удалить
  • delete_all
  • find_by_sql
  • инкремент
  • increment_counter
  • toggle
  • touch
  • update_column
  • update_all, а
  • update_counters

это пропустит ваши проверки:

vote.save(:validate => false)

подробнее здесь

чтобы пропустить ваши обратные вызовы и проверки, вы можете использовать, update_column v(3.1) или update_all

vote = Vote.first
vote.update_column(:subject, 'CallBacks')

Aparently это работает только с ActiveRecord 3.1

или:

Vote.where('id = ?', YourID).update_all(:subject => 'CallBacks')

в конце концов у вас есть также я, наконец, вариант, и это пропустит все:

execute "UPDATE votes SET subject = 'CallBacks' WHERE id = YourID"

ОК последний это не так красиво.