Как пропустить обратные вызовы ActiveRecord? [дубликат]
Возможные Дубликаты:
как я могу избежать запуска ActiveRecord обратных вызовов?
у меня есть такая модель
class Vote < ActiveRecord::Base
after_save :add_points_to_user
.....
end
можно ли как-то заставить модель пропустить вызов add_points_to_user
при сохранении? Возможно, что-то вроде ActiveRecord#delete
vs ActiveRecord#destroy
?
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"
ОК последний это не так красиво.