我正在尝试更新翻译,但它变成了无限循环,因为在执行方法中我重复保存。我该如何解决这个问题?
before_update :update_translations, on: :edit
def update_translations
id = self.id
order = Order.find(id)
locale = order.translations.find(order.translation.id).locale.to_s
TranslateOrderFeedbackWorker.perform_async(id, locale)
end
def perform(id, current_locale)
order = Order.find(id)
I18n.locale = current_locale
text = order.feedback
translator = TranslateTextService.new
I18n.available_locales.each do |locale|
next if locale.to_s == current_locale
I18n.locale = locale
order.feedback = translator.translate(text, current_locale, locale.to_s)
end
order.save # <= infinity loop here
end
最佳答案
解决这个问题的一个简单方法是在模型上添加一个虚拟属性,它告诉它是否运行作业:
# in your model
attr_accessor :translated
# in your update_translations method
unless translated
TranslateOrderFeedbackWorker.perform_async(id, locale)
end
# in your job
order.translated = true
order.save
您也可以将 translated
设置为数据库中的实际列 - 代码将相同,但您不需要虚拟属性(attr_accessor
)。
如果有很多此类标志(记录必须经过转换管道),您可以考虑使用状态机,例如 aasm .
关于ruby-on-rails - before_update 回调中的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57985374/