На что распространяется save (: validate => false)? - PullRequest
5 голосов
/ 18 марта 2011

Я только что реализовал несколько пользовательских counter_cache с использованием кода, подобного следующему:

def after_save
    self.update_counter_cache
end
def after_destroy
    self.update_counter_cache
end
def update_counter_cache
    self.company.new_matchings_count = Matching.where(:read => false).count
    self.company.save
end

Мой вопрос заключается в следующем - что на самом деле предотвращает команда Model.save(:validate => false), помимо validates_with или before_validation?

Будут ли затронуты мои пользовательские counter_caches, если я сохраню существующие сохранения без проверки?

Ответы [ 2 ]

3 голосов
/ 18 марта 2011

Если вы передаете: validate => false, он пропускает действительные? команда. Все остальное работает так же.

Вы можете проверить код здесь: http://api.rubyonrails.org/classes/ActiveRecord/Validations.html

def save(options={})
  perform_validations(options) ? super : false
end

...

if perform_validation
  valid?(options.is_a?(Hash) ? options[:context] : nil)
else
  true
end
2 голосов
/ 17 января 2017

Тестирование на Rails 4.2.6 показывает, что .save(:validate=>false) фактически пропустит обратные вызовы before_validations и after_validation.

...