2010-09-09 74 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")

相关问题