Как я запускаю грабли в моем приложении rails - PullRequest
10 голосов
/ 09 сентября 2010

Что я хочу сделать:

В model.rb, в after_commit я хочу запустить задачу rake ts: reindex

ts: reindex обычно запускается с граблями ts: index

Ответы [ 5 ]

30 голосов
/ 09 сентября 2010

Если вы хотите, чтобы этот код rake выполнялся во время цикла запроса, вам следует избегать запуска rake через system или любое из семейства exec (включая backticks), поскольку это будет запускать новый интерпретатор ruby ​​и каждый раз перезагружать среду rails.он называется.

Вместо этого вы можете напрямую вызывать команды Rake следующим образом: -

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

3 голосов
/ 03 марта 2015

У меня была такая же проблема, и я не смог получить принятый ответ для работы в моем контроллере с проектом Rails 4 из-за ошибки файла загрузки. Этот пост дал мне рабочее решение:

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 голосов
/ 05 марта 2015
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").

0 голосов
/ 07 февраля 2019

Этот код автоматически загружает задачи Rake для вашего приложения Rails, даже не зная, как называется ваше приложение:)

class MySidekiqTask
  include Sidekiq::Worker

  def perform
    application_name = Rails.application.class.parent_name
    application = Object.const_get(application_name)
    application::Application.load_tasks
    Rake::Task['db:migrate'].invoke
  end
end
0 голосов
/ 09 сентября 2010

Вы пробовали `rake ts: reindex`?

...