Ruby before_validation запускает бесконечный цикл обратного вызова - PullRequest
0 голосов
/ 03 октября 2018

Модель продукта имеет атрибут_1.Если для атрибута_1 требуется перерасчет, то вызовет before_validation.Это дает SystemStackError: stack level too deep, потому что self.save! вызывает before_validation.Как остановить бесконечный цикл обратного вызова.

before_validation :method_1, :if => :recalculation_required_attribute

Я использую оптимистическую блокировку с использованием lock_version.update_all не увеличит lock_version.Поэтому я использую save!.Это вызывает бесконечный вид обратного вызова.

def method_1
    ####
    ####
    if self.lock_version == Product.find(self.id).lock_version
       Product.where(:id => self.id).update_all(attributes)
       self.attributes = attributes
       self.save!
    end
end

1 Ответ

0 голосов
/ 03 октября 2018

Вам не нужно self.save! там: вы уже находитесь внутри транзакции, поэтому просто делайте все, что хотите, и позвольте Rails сохранить запись, как только вы закончите.

Sidenotes:

  • Product.where(:id => self.id).update_all(attributes), вероятно, можно переписать как products.update_all(attributes) (наличие ассоциации this_model has_many :products
  • self.attributes = attributes является избыточным, если attributes не является методом экземпляра.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...