我有一个名为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
答案 0 :(得分:2)
合理的人可能不会强制执行每个rake任务不超过一行的严格规则,但将.rake文件中的大块代码移到类中肯定更好:
所以,
require
使用它们的rake任务中的类。 (不要将您的应用程序配置为自动加载库;这会在生产应用程序中加载不需要的代码及其依赖项。)答案 1 :(得分:1)
我不同意您关联的帖子,并认为您的方法很好。 rake任务通常不可能或不实用为一个衬里。通常,Rake任务用于一次性任务,如批量迁移或更新数据库(通过迁移,我的意思是数据迁移,而不是模式迁移,这可能是这里的情况)。
在这种情况下,更新代码库以包含仅打算运行一次的代码是不合理的,并且在rake任务中处理逻辑没有问题。 / p>