Отключить отслеживание public_activity для заданий sidekiq, для которых требуется current_user
Короче я получаю ошибку, что public_activity
ищет current_user
при обновлении модели во время sidekiq
работа. Что ожидается, так как нет current_user
.... как отключить public_activity
отслеживание во время работы? Я пытался изменить PublicActivity.enabled = false
а также Prospect.public_activity_off
во время работы, но tracked owner: Proc.new{ |controller, model| controller.current_user }
все еще, кажется, поднимает это и ищет current_user
Как я могу иметь sidekiq
(или любая работа) делать обновления без public_activity
мешающий?
Было бы лучше иметь sidekiq
установить current_user
фиктивному пользователю во время работы? Я не думаю, что это было бы хорошей идеей, потому что тогда мы должны были бы отфильтровать это позже.
Ошибка:
2016-04-20T17:24:53.728Z 20447 TID-owpsaw07w ProspectDataAggregationWorker JID-bad79ab6a073d57d7388e931 INFO: start
2016-04-20T17:24:53.739Z 20447 TID-owpsaw07w ProspectDataAggregationWorker JID-bad79ab6a073d57d7388e931 INFO: fail: 0.01 sec
2016-04-20T17:24:53.739Z 20447 TID-owpsaw07w WARN: {"class"=>"ProspectDataAggregationWorker", "args"=>[1], "retry"=>false, "queue"=>"default", "jid"=>"bad79ab6a073d57d7388e931", "created_at"=>1461173093.728181, "enqueued_at"=>1461173093.7282372}
2016-04-20T17:24:53.739Z 20447 TID-owpsaw07w WARN: NoMethodError: undefined method `current_user' for nil:NilClass
2016-04-20T17:24:53.739Z 20447 TID-owpsaw07w WARN: /Users/cj/RubymineProjects/revenue_management_system/app/models/prospect.rb:3:in `block in <class:Prospect>'
/Users/cj/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/public_activity-1.5.0/lib/public_activity/common.rb:14:in `resolve_value'
/Users/cj/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/public_activity-1.5.0/lib/public_activity/common.rb:315:in `prepare_relation'
/Users/cj/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/public_activity-1.5.0/lib/public_activity/common.rb:281:in `prepare_settings'
/Users/cj/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/public_activity-1.5.0/lib/public_activity/common.rb:250:in `create_activity'
/Users/cj/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/public_activity-1.5.0/lib/public_activity/actions/update.rb:14:in `activity_on_update'
/Users/cj/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-4.2.6/lib/active_support/callbacks.rb:432:in `block in make_lambda'
Полная ошибка: https://gist.github.com/cdesch/190c46c69213a37e4162e50727531761
Модель:
class Prospect < ActiveRecord::Base
include PublicActivity::Model
tracked owner: Proc.new{ |controller, model| controller.current_user }
...
end
Sidekiq Работа / работник
class ProspectDataAggregationWorker
include Sidekiq::Worker
sidekiq_options :retry => false # job will be discarded immediately if failed
def perform(account_id)
#Prospect.public_activity_off
PublicActivity.enabled = false
account = Account.where(id: account_id).first
prospects = account.prospects
prospects.each do |prospect|
prospect.update_based_on_primary_assessment!
end
PublicActivity.enabled = true
#Prospect.public_activity_on
end
end
Я также разместил этот же вопрос в выпусках public_activity
2 ответа
Вы можете пропустить проблему до того, как эта проблема будет решена, если вы спасете свою ошибку:
tracked owner: Proc.new do |controller, model|
controller.current_user rescue nil_or_User_new_or_something_else
end
Эта проблема в конечном итоге не была sidekiq
или же public_activity
драгоценные камни. Выполнение Prospect.public_activity_off работало (ниже), хотя я ранее заявлял, что это не так. Проблема заключалась в том, что sidekiq
процесс кэшировал модели и работников, поэтому любые изменения, которые я вносил в модели, не вступали в силу до sidekiq
был переработан / перезапущен. После чего следующие функции работали нормально.
def perform(account_id)
Prospect.public_activity_off
...
end
или следующее:
class ApplicationWorker
include Sidekiq::Worker
def perform(*args)
PublicActivity.without_tracking { super(*args) }
end
end
В основе проблемы была не проблема кода, а проблема разработчика.:-) Запустить снова sidekiq
после внесения рабочих изменений!