2012-11-12 17 views
1

我使用Capistrano進行部署,使用Sidekiq進行隊列。我需要加載用戶ID來設置:在deploy.rb文件中執行sidekiq隊列的sidekiq_queues變量。現在我用下面的代碼將ActiveRecord的數據加載到Capistrano的deploy.rb

set :sidekiq_queues, ::User.all.map {|u| "-q parsing_user_#{u.id}"}.join(" ") + " -q parsing_user_0" 

但它拋出以下錯誤

./config/deploy.rb:29:in `load': uninitialized constant User (NameError) 

我試圖要求「RubyGems的」和「active_record」到deploy.rb,但它並沒有幫助。 結果我應該有 sidekiq_queues ==「-q parsing_user_1 -q parsing_user_2 -q parsing_user_3 -q parsing_user_4 -q parsing_user_5 -q parsing_user_0」。 硬編碼隊列名稱不是解決方案。

回答

1

Capistrano在本地執行deploy.rb,並且它不會在deploy.rb中加載您的Rails環境。

它可能比它的價值更麻煩。特別是如果你想在你的遠程服務器上執行它,你可能會考慮做一個Rake任務。 rake任務中的=> :environment可確保您的Rails環境已加載。

# in deploy.rb 
namespace :sidekiq do 
    desc "Do something with queues" 
    task :queues, :roles => :web do 
    run "cd #{current_path} ; RAILS_ENV=#{rails_env} bundle exec rake sidekiq:queues" 
    end 
end 

# you'll need to decide when to execute this in your deployment process, 
# something like this: 

after "deploy:update_code", "sidekiq:queues" 



# in lib/tasks/sidekiq.rake 
namespace :sidekiq do 
    desc "Do something with queues" 
    task :queues => :environment do 
    queues = (User.scoped.pluck(:id) + [0]).map{|id| "-q parsing_user_#{id}"}.join(" ") 
    # do what you need to do 
    end 
end 
相關問題