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

Возможный дубликат:
Как избежать обратных вызовов ActiveRecord?

У меня есть модель, подобная этой

class Vote < ActiveRecord::Base  
    after_save :add_points_to_user

    .....
end

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

Ответ 1

Для Rails 2, но не Rails 3, вы можете использовать их:

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

Ответ 2

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

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

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

Ответ 3

Следующее относится к рельсам 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
  • нажмите
  • update_column
  • update_all
  • update_counters

Ответ 4

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

vote.save(:validate => false)

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

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

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

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

Или:

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

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

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

ОК, последнее не очень красивое.