DRY in ActiveJob::Base

7
我需要在Jobs中使用数据清洗技术,所以我编写了一个方法。
  def sanitized_sql_statement(query)
    ActiveRecord::Base.send(
        :sanitize_sql_array,
        query
    )
  end

我有两个不同的工作文件。我应该把这个方法放在哪里,如何从工作中使用它?

1个回答

15

使用concern
在jobs目录下创建concerns目录,路径为app/jobs/concerns,就像models和controllers所做的那样。

编写concern文件。

module SqlSanitizer
  extend ActiveSupport::Concern

  def sanitized_sql_statement(query)
    ActiveRecord::Base.send(
      :sanitize_sql_array,
      query
    )
  end
end

并且在你的工作中包含

class YourJob < ActiveJob::Base
  include SqlSanitizer

  # ... do something
end

如果您无法自动加载SqlSanitizer,请在config/application.rb文件中添加自动加载路径 => config.autoload_paths << "#{Rails.root}/app/jobs/concerns"


我遇到了一个错误 NameError (未初始化常量 NotifierJob::SqlSanitizer): 它在使用 ActiveJob 时无法工作。 - Max Paprikas
2
@MaxPaprikas,你觉得这样行吗 include ::SqlSanitizer。如果担心文件没有被加载,可以在配置文件中添加路径 config.autoload_paths << "#{Rails.root}/app/jobs/concerns" - Jaehyun Shin
1
非常好!请在答案中添加有关自动加载的信息(自动加载解决了问题)。 - Max Paprikas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接