ruby-on-rails - before_update 回调中的无限循环

标签 ruby-on-rails ruby

我正在尝试更新翻译,但它变成了无限循环,因为在执行方法中我重复保存。我该如何解决这个问题?

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/

相关文章:

ruby-on-rails - 自定义错误重定向,闪光通知不起作用

ruby 循环重构

ruby - 用于确定应用程序描述是否用英语编写的算法的错误

ruby-on-rails - 如何将浮点形式的时间(hh.mm)除以 ruby 中的整数?

ruby-on-rails - 使用声明性授权对嵌套资源进行属性检查

javascript - 如何从命令行运行 QUnit 测试?

ruby-on-rails - 带 ruby​​ on rails 的多维数组

mysql - 为什么仅通过 Rails 中的套接字访问我的 Rails mysql 时会损坏?

ruby - 求 a 和 b 之间所有数字的和 : Ruby

ruby - 将字符串拆分为最大字符数的 block 而不打断单词