Есть ли способ пропустить обратные вызовы и проверку, выполнив что-то в этих строках в Rails 3?
Object.save(:validate => false, :skip_callbacks => true)
Спасибо!
Есть ли способ пропустить обратные вызовы и проверку, выполнив что-то в этих строках в Rails 3?
Object.save(:validate => false, :skip_callbacks => true)
Спасибо!
Раньше я встречал что-то подобное, и я использовал это:
Model.send(:create_without_callbacks)
Model.send(:update_without_callbacks)
Object.save(:validate => false)
работает так, как вы ожидали. Насколько я знаю, вы не можете отключить обратные вызовы (если вы не вернете false из обратного вызова before_, но затем прекратите транзакцию).
Пропуск обратных вызовов немного сложнее. Некоторые плагины и адаптеры добавляют свои собственные "существенные" обратные вызовы (actions_as_nested_set, oracle_enhanced_adapter в качестве примеров).
Вы можете использовать методы skip_callback
и set_callback
, чтобы проверить, какие из них вы могли бы пропустить.
Некоторые методы пользовательского класса могут помочь:
def skip_all_callbacks(klass)
[:validation, :save, :create, :commit].each do |name|
klass.send("_#{name}_callbacks").each do |_callback|
# HACK - the oracle_enhanced_adapter write LOBs through an after_save callback (:enhanced_write_lobs)
if (_callback.filter != :enhanced_write_lobs)
klass.skip_callback(name, _callback.kind, _callback.filter)
end
end
end
end
def set_all_callbacks(klass)
[:validation, :save, :create, :commit].each do |name|
klass.send("_#{name}_callbacks").each do |_callback|
# HACK - the oracle_enhanced_adapter write LOBs through an after_save callback (:enhanced_write_lobs)
if (_callback.filter != :enhanced_write_lobs)
klass.set_callback(name, _callback.kind, _callback.filter)
end
end
end
end
Чтобы пропустить обратные вызовы в Rails 3, вы можете использовать update_all
для вашей цели.
Источник: update_all
Полный список пропущенных обратных вызовов приведен ниже:
Источник: Пропуск обратных вызовов
Если вы пытаетесь обновить запись, пропускающую все обратные вызовы и проверки, вы можете использовать update_columns
, передавая хэш атрибутов. Этот метод будет обновлять столбцы непосредственно в базе данных.
Например:
object.update_columns(name: 'William')
Если вы хотите создать новый объект, к сожалению, я думаю, что нет способа пропустить как проверки, так и обратные вызовы. save(:validate => false)
работает для проверки. Для обратных вызовов вы можете использовать skip_callback
, но будьте осторожны, ваш код, вероятно, не будет потокобезопасным.
http://guides.rubyonrails.org/active_record_validations_callbacks.html подробно описывает небольшой список методов, которые не позволяют выполнять обратные вызовы и проверки - ни одна из них не включает в себя "сохранить".
Тем не менее, точка валидации и обратных вызовов заключается в обеспечении соблюдения бизнес-логики. Если вы избегаете их - вы должны спросить себя, почему.
Смотрите также: Как избежать обратных вызовов ActiveRecord?