Подтвердить что ты не робот

Пропуск обратных вызовов и проверка

Есть ли способ пропустить обратные вызовы и проверку, выполнив что-то в этих строках в Rails 3?

Object.save(:validate => false, :skip_callbacks => true)

Спасибо!

4b9b3361

Ответ 1

Раньше я встречал что-то подобное, и я использовал это:

Model.send(:create_without_callbacks)
Model.send(:update_without_callbacks)

Ответ 2

Object.save(:validate => false)

работает так, как вы ожидали. Насколько я знаю, вы не можете отключить обратные вызовы (если вы не вернете false из обратного вызова before_, но затем прекратите транзакцию).

Ответ 3

Пропуск обратных вызовов немного сложнее. Некоторые плагины и адаптеры добавляют свои собственные "существенные" обратные вызовы (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

Ответ 4

Чтобы пропустить обратные вызовы в Rails 3, вы можете использовать update_all для вашей цели.

Источник: update_all

Полный список пропущенных обратных вызовов приведен ниже:

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

Источник: Пропуск обратных вызовов

Ответ 5

Если вы пытаетесь обновить запись, пропускающую все обратные вызовы и проверки, вы можете использовать update_columns, передавая хэш атрибутов. Этот метод будет обновлять столбцы непосредственно в базе данных.

Например:

object.update_columns(name: 'William')

Если вы хотите создать новый объект, к сожалению, я думаю, что нет способа пропустить как проверки, так и обратные вызовы. save(:validate => false) работает для проверки. Для обратных вызовов вы можете использовать skip_callback, но будьте осторожны, ваш код, вероятно, не будет потокобезопасным.

Ответ 6

http://guides.rubyonrails.org/active_record_validations_callbacks.html подробно описывает небольшой список методов, которые не позволяют выполнять обратные вызовы и проверки - ни одна из них не включает в себя "сохранить".

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

Смотрите также: Как избежать обратных вызовов ActiveRecord?