如何设计调用多个class方法的rake任务?
How to design a rake task that calls multiple class methods?
我有一个名为 pull_orders
的 rake 任务,它调用 RemoteDbConnector
class 的方法来做一些事情,比如建立与外部数据库的连接,生成原始 SQL查询,执行查询并将记录存储在本地数据库中。
在尝试对其进行测试时,我偶然发现了 ,这让我开始思考我的设计是否存在缺陷。
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
我不同意你链接的 post,我认为你的方法很好。将 rake 任务作为一个衬里通常是不可能或不切实际的。通常,Rake 任务用于一次性任务,如批量迁移或更新数据库(我所说的迁移是指数据迁移,而不是模式迁移,这里可能就是这种情况)。
在这种情况下,更新代码库以包含仅打算 运行 一次的代码是不合理的,并且处理 rake 任务中的逻辑没有问题。
有理智的人可能不会强制执行每个 rake 任务不超过一行的严格规则,但是将大块代码从 .rake 文件移到 classes 中肯定更好:
- 短的 rake 任务使 .rake 文件的结构更清晰。
- 大块代码通常应该分解成多个小方法,并用名称来解释它们的作用。您可以只在 .rake 文件中执行此操作,但那样您将混合使用 rake 任务和方法,这不像一组统一的 rake 任务那样容易阅读。
- 普通 classes 更容易测试。
所以,
- 从您的大抽成任务中提取 classes。您最初可以在与从中提取它的任务相同的 .rake 文件中定义这样的 class 作为中间步骤。
- 将 classes 从 .rake 文件移动到项目的 lib 目录中,而不是在 lib/tasks(用于 .rake 文件)中,而是在 lib 的根目录或 lib 的子目录中对应于他们的命名空间,如果他们有的话。
require
rake 任务中的 classes 使用了它们。 (不要将您的应用配置为自动加载库;那样会在您的生产应用程序中加载不需要的代码及其依赖项。)
- 像测试任何 classes 一样测试 classes。
我有一个名为 pull_orders
的 rake 任务,它调用 RemoteDbConnector
class 的方法来做一些事情,比如建立与外部数据库的连接,生成原始 SQL查询,执行查询并将记录存储在本地数据库中。
在尝试对其进行测试时,我偶然发现了
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
我不同意你链接的 post,我认为你的方法很好。将 rake 任务作为一个衬里通常是不可能或不切实际的。通常,Rake 任务用于一次性任务,如批量迁移或更新数据库(我所说的迁移是指数据迁移,而不是模式迁移,这里可能就是这种情况)。
在这种情况下,更新代码库以包含仅打算 运行 一次的代码是不合理的,并且处理 rake 任务中的逻辑没有问题。
有理智的人可能不会强制执行每个 rake 任务不超过一行的严格规则,但是将大块代码从 .rake 文件移到 classes 中肯定更好:
- 短的 rake 任务使 .rake 文件的结构更清晰。
- 大块代码通常应该分解成多个小方法,并用名称来解释它们的作用。您可以只在 .rake 文件中执行此操作,但那样您将混合使用 rake 任务和方法,这不像一组统一的 rake 任务那样容易阅读。
- 普通 classes 更容易测试。
所以,
- 从您的大抽成任务中提取 classes。您最初可以在与从中提取它的任务相同的 .rake 文件中定义这样的 class 作为中间步骤。
- 将 classes 从 .rake 文件移动到项目的 lib 目录中,而不是在 lib/tasks(用于 .rake 文件)中,而是在 lib 的根目录或 lib 的子目录中对应于他们的命名空间,如果他们有的话。
require
rake 任务中的 classes 使用了它们。 (不要将您的应用配置为自动加载库;那样会在您的生产应用程序中加载不需要的代码及其依赖项。)- 像测试任何 classes 一样测试 classes。