在加载 Rails 个模型之前在 rake 任务中做一些事情

Do something in a rake task before Rails models are loaded

我有一个与模型一起工作的 rake 任务。但我需要告诉模型它们是从 Rake 中使用的,而不是在应用程序中使用的。我最好的想法是在 运行 执行 rake 任务之前在命令行上设置一个环境变量,但这需要团队中的每个人都记住使用环境变量。具体来说,我有一个 if 语句来跳过加载 Delayed::Jobhandle_asynchronously 而 运行 执行 rake 任务。

class Thing < ActiveRecord::Base
  searchable do
    string :title
    text :title, :content
  end
  handle_asynchronously unless ENV['MIGRATINGDATA']
end

当我们 运行 我们执行迁移任务时:

MIGRATINGDATA=true bundle exec rake project:migrate_data

我想摆脱对命令行进行特殊添加的需要。我们的迁移代码加载了一个假的 Sunspot 实例以在迁移数据时关闭索引。

如果你的模型关心你是否在 rake 任务中使用它们,那你就做错了。相反,您可以向某些方法添加参数,例如。在您的特定用例中,您可以立即 运行 作业。把它放在你的 rake 任务的开始:

Delayed::Worker.delay_jobs = false

只需在 Rakefile:

的顶部设置一些内容
ENV['HELLO_RAKE'] = true

require_relative 'config/application'

Rails.application.load_tasks

如果需要,您可以设置一个常量,而不是使用 ENV,例如HELLO_RAKE = true 然后勾选 defined?(HELLO_RAKE).

另一种方法是只检查 运行 程序是否为 rake:

handle_asynchronously unless File.basename([=11=]) == "rake"

这两种方法的一个缺点是它们会在您使用 Rake 的任何时候生效,这将包括与迁移无关的其他 Rake 任务。