2017-02-28 86 views
0

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

我想摆脱,需要特殊的除了命令行。我们的迁移代码在迁移数据时加载假太阳黑子实例以关闭索引。

回答

1

刚刚成立的东西在你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($0) == "rake" 

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

+0

这看起来像会起作用!我试了一下,似乎按预期工作。我使用了ENV,它正在模型之前加载和设置。谢谢! – Sixty4Bit

0

如果你的模型很在意你是否从一个rake任务中使用它们,那么你做错了什么。相反,您可以为某些方法添加参数,例如。在您的特定用例中,您可以立即运行作业。你应该在你的rake任务的开始:

Delayed::Worker.delay_jobs = false 
+0

有关模型的好处不应该在乎它们是否在耙中。通常我会同意,但在这种情况下,我们正在迁移数据,并且不需要这一行,因为迁移后我们会照顾它。这只会做一次。成功部署后,此代码将被删除。然而,我们在开发之前需要这些,直到我们实际部署。 'delayed_jobs = false'没有帮助。我愿意选择。 – Sixty4Bit

相关问题