如何设计一个调用多个类方法的rake任务?

时间:2016-05-01 02:18:58

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

我有一个名为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

2 个答案:

答案 0 :(得分:2)

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

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

所以,

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

答案 1 :(得分:1)

我不同意您关联的帖子,并认为您的方法很好。 rake任务通常不可能或不实用为一个衬里。通常,Rake任务用于一次性任务,如批量迁移或更新数据库(通过迁移,我的意思是数据迁移,而不是模式迁移,这可能是这里的情况)。

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