2014-12-08 5 views
2

Я использую sidekiq для выполнения некоторых фоновых заданий, но имею некоторые сомнения в передаче аргументов perform метода sidekiq's класс рабочих.Аргументы для метода sidekiq worker

Сценарий: Как только пользователь вводит в моем приложении я храню данные журнала в моей модели user_sessions.

As-обычный выполнение специального действия в моем контроллере. Но после отображения информации пользователю мне нужно выполнить некоторую дополнительную операцию и нужно обновить один столбец в модели user_session.

СЛЕДОВАЛИ процедура упоминается here

шаг 1: Добавлен gem 'sidekiq' в гем файл.

Шаг 2: Установленный 'redis' драгоценный камень.

шага 3: расслоение установить

шаг 4:

class MyController < ApplicationController 
def MyAction 
    #perform dedicated action 
    @info = #render data to user 
    param1 = #parameter to find in user_session model(its a string.i don't get id of model here) 
    param2 = #extra param to perform task 
    UpdateWorker.perform_async(param1,param2) 
end 
end 

шага 5: Создана папку уборщицы в папке приложения.

class UpdateWorker 
    include Sidekiq::Worker 
    def perform(param1,param2) 
     puts "======> updating " 
     #retrieve `user_session` based on param1(note: param1 is not an id) 
     #perform update functions 
     UserSession.update_attribute(:column, value) 
    end 
end 

шаг 6: Начало rails server

шага 7: В другой вкладке начало bundle exec sidekiq

Error NoMethodError (undefined method 'key?' for JSON::Ext::Generator::State:0x007f1b......

Как уже упоминалось here и here мне нужно передать идентификатор объекта в параметрах. Что касается моего сценария, кто-нибудь может предложить мне, как решить мою проблему?

+0

я должен понизить мой мульти-JSon версию ли? – Aparichith

+0

Итак, первое, что нужно сделать, это зарегистрировать тип param1 и param2 в контроллере. Почти уверен, что вы передаете сложный, несериализуемый объект в сторону Sidekiq. –

+0

@PeterGoldstein будучи новичком, я мало что понял, что вы прокомментировали. Не могли бы вы немного объяснить об этом. Пожалуйста? – Aparichith

ответ

3

Это было бы лучшим способом:

array = [param1,param2] 

UpdateWorker.perform_async(array) 

Теперь в рабочий Вы можете использовать массив

Смежные вопросы