Ответ 1
Для Rails 2, но не Rails 3, вы можете использовать их:
object.send(:create_without_callbacks)
object.send(:update_without_callbacks)
Возможный дубликат:
Как избежать обратных вызовов ActiveRecord?
У меня есть модель, подобная этой
class Vote < ActiveRecord::Base
after_save :add_points_to_user
.....
end
Можно ли каким-то образом заставить модель пропустить вызов add_points_to_user
при сохранении? Возможно, что-то вроде ActiveRecord#delete
vs ActiveRecord#destroy
?
Для Rails 2, но не Rails 3, вы можете использовать их:
object.send(:create_without_callbacks)
object.send(:update_without_callbacks)
Для Rails 3, ActiveSupport:: Обратные вызовы предоставляет необходимый элемент управления. Я столкнулся с одной и той же проблемой в сценарии интеграции данных, где обычно желательные обратные вызовы нужно было отмалчивать. Вы можете переустановить файлы в массе, или использовать skip_callback, чтобы отключить разумно, например:
Vote.skip_callback(:save, :after, :add_points_to_user)
.. после чего вы можете работать с экземплярами Vote с помощью: add_points_to_user запрещен
Следующее относится к рельсам 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
Это пропустит ваши проверки:
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"
ОК, последнее не очень красивое.