2010-09-09 86 views

回答

29

如果你希望這個rake代碼在請求週期內運行,那麼你應該避免通過system或任何exec系列(包括反引號)運行rake,因爲這將啓動一個新的ruby解釋器並每次重新加載rails環境叫做。

相反,你可以撥打耙直接命令如下: -

require 'rake' 

class SomeModel <ActiveRecord::Base 

    def self.run_rake(task_name) 
    load File.join(RAILS_ROOT, 'lib', 'tasks', 'custom_task.rake') 
    Rake::Task[task_name].invoke 
    end 
end 

注:Rails的4+,您將使用Rails.root,而不是RAILS_ROOT

,然後只用SomeModel.run_rake("ts:reindex")

這裏的關鍵部分是require rake並確保您加載包含任務定義文件。從http://railsblogger.blogspot.com/2009/03/in-queue_15.html

+0

這會減慢請求嗎?把它變成一個工人對嗎? – Strawberry 2013-04-15 08:13:34

+0

這幾乎肯定會減慢請求速度。我不知道他是否應該這樣做,因爲我不知道他的申請。我只是在幫助解決特定的問題,他應該怎樣從Rails中調用Rake,而不是這樣做是否是一個好主意。 – 2013-04-15 13:56:34

+0

這個工作適合你嗎?我已經設置好了,不會出現任何錯誤,但是我不會在任何地方看到任務的結果,也就是說這個任務似乎沒有被執行。 – kakubei 2013-12-06 15:35:46

-7

你試過`耙ts:reindex`?

2

獲得

大多數信息我有這個同樣的問題,不能得到公認的答案在我與軌道4項目控制器開始工作由於加載文件錯誤。 This post給了我一個工作的解決方案:

def restart_search 
    require 'rake' 
    spec = Gem::Specification.find_by_name 'thinking-sphinx' 
    load "#{spec.gem_dir}/lib/thinking_sphinx/tasks.rb" 
    Rake::Task["ts:stop"].execute 
    Rake::Task["ts:start"].execute 
    respond_to do |format| 
    format.js { head :ok } 
    end 
end 
2
require 'rake' 
RailsApp::Application.load_tasks 
class SomeModel <ActiveRecord::Base 
    def self.run_rake(task_name) 
    load File.join(Rails.root, 'lib', 'tasks', 'custom_task.rake') 
    Rake::Task[task_name].invoke 
    end 
end 

,然後只用SomeModel.run_rake("ts:reindex")

相關問題