Ruby on rails 在加载Rails模型之前,在rake任务中执行一些操作

Ruby on rails 在加载Rails模型之前,在rake任务中执行一些操作,ruby-on-rails,ruby,rake,delayed-job,sunspot,Ruby On Rails,Ruby,Rake,Delayed Job,Sunspot,我有一个与模型一起工作的rake任务。但我需要告诉这些模型,它们是从Rake而不是在应用程序中使用的。我的最佳想法是在运行rake任务之前在命令行上设置一个环境变量,但这需要团队中的每个人都记住使用环境变量。具体来说,我有一个if语句,可以在运行rake任务时跳过加载Delayed::Job的异步处理 class Thing < ActiveRecord::Base searchable do string :title text :title, :content

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

class Thing < ActiveRecord::Base
  searchable do
    string :title
    text :title, :content
  end
  handle_asynchronously unless ENV['MIGRATINGDATA']
end
class Thing
当我们运行迁移任务时,我们会执行以下操作:

MIGRATINGDATA=true bundle exec rake项目:migrate_data


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

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

Delayed::Worker.delay_jobs = false

只需在您的
Rakefile
顶部设置一些内容:

ENV['HELLO_RAKE'] = true

require_relative 'config/application'

Rails.application.load_tasks
如果需要,您可以设置一个常量,例如
HELLO\u RAKE=true
,然后选中
defined?(HELLO\u RAKE)
,而不是使用
ENV

另一种方法是只检查正在运行的程序是否是rake

handle_asynchronously unless File.basename($0) == "rake"

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

关于模型的优点不应该关心它们是否在Rake中。通常我会同意,但在这种情况下,我们正在中迁移数据,不需要运行这一行,因为我们将在迁移后处理它。这只会做一次。成功部署后,将删除此代码。然而,在实际部署之前,我们需要在开发中使用它
delayed_jobs=false
没有帮助。我对其他选择持开放态度。这看起来会奏效的!我试了一下,似乎工作正常。我使用了ENV,它在模型之前被加载和设置。谢谢