【问题标题】:How to design a rake task that calls multiple class methods?如何设计一个调用多个类方法的 rake 任务?
【发布时间】:2016-08-26 00:47:54
【问题描述】:

我有一个名为 pull_orders 的 rake 任务,它调用 RemoteDbConnector 类的方法来执行诸如建立与外部数据库的连接、生成原始 SQL 查询、执行查询以及在本地数据库中存储记录等操作。

在尝试对其进行测试时,我偶然发现了this answer,这让我开始思考我的设计是否存在缺陷。

rake 任务真的应该是一个班轮吗?如果是这样,考虑到它们需要按特定顺序调用,我应该把所有这些方法调用放在哪里?

我的任务如下所示:

namespace :db do
  desc 'finds and populates data from remote db'
  task pull_orders: :environment do
    ...
    columns = ...
    table = ...
    options = ...
    column_mappings = ...
    RemoteDbConnector.generate_query(...)
    RemoteDbConnector.execute_query(...)
    RemoteDbConnector.map_column_names(...)
    Order.create(...) #creates records based on hash generated by RemoteDbConnector
    ...

  end
end

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 rake


    【解决方案1】:

    理性的人可能不会强制执行每个 rake 任务不超过一行的严格规则,但将大块代码从 .rake 文件移到类中肯定更好:

    • 简短的 rake 任务使 .rake 文件的结构更清晰。
    • 大的代码块通常应该分解成多个小方法,其名称可以解释它们的作用。您可以在 .rake 文件中执行此操作,但是您会混合使用 rake 任务和方法,这不像一组统一的 rake 任务那样容易阅读。
    • 普通类更容易测试。

    所以,

    • 从您的大型 rake 任务中提取类。作为中间步骤,您最初可以在与从中提取它的任务相同的 .rake 文件中定义此类。
    • 将类从 .rake 文件移动到项目的 lib 目录中,而不是在 lib/tasks(用于 .rake 文件)中,而是在 lib 的根目录中,或者在与其名称空间对应的 lib 的子目录中(如果有的话)。
    • require rake 任务中使用它们的类。 (不要将您的应用配置为自动加载 lib;这会在您的生产应用中加载不需要的代码及其依赖项。)
    • 像测试任何课程一样测试课程。

    【讨论】:

      【解决方案2】:

      我不同意您链接的帖子,并认为您的方法很好。 rake 任务通常是不可能或不切实际的。很多时候,Rake 任务用于一次性任务,例如批量迁移或更新数据库(迁移是指数据迁移,而不是模式迁移,这里可能就是这种情况)。

      在这种情况下,更新代码库以包含只打算运行一次的代码是不合理的,并且在 rake 任务中处理逻辑没有问题。

      【讨论】:

        猜你喜欢
        • 2013-07-20
        • 1970-01-01
        • 2010-12-25
        • 1970-01-01
        • 2020-05-19
        • 1970-01-01
        • 2014-02-27
        • 2020-12-23
        • 1970-01-01
        相关资源
        最近更新 更多