Я разрабатываю небольшую утилиту на Ruby. Её две основные задачи: переодичное выполнение HTTP запроса с сохраненим ответа в БД и отображение полученых данных в веб-интерфейсе.
В качестве инструментов я выбрал:
- Sinatra - для веб-интерфейса
- Mongoid - для дата маппинга
- Sidekiq - фоновой задачи
И если с первым всё предельно ясно, то с последними двумя начинаются трудности. Внутри дескрайба класса воркера невозможно обратиться к модели (из-за
unitialized constant AwesomeWorker::AwesomeModel, передать экземпляр модели в качестве аргумента воркеру также проблематично т. к. Sidekiq приводит все аргументы к
String. Я сделал небольшой воркэраунд передавая в качестве аргумента воркеру
object_id свежесозданной модели, а внутри воркера снова получаю экземпляр модели с помощью
ObjectSpace._id2ref но это какой-то грязный хак (еще и не работает):
require 'sidekiq'
require 'awesome_model'
class AwesomeWorker
include Sidekiq::Worker
def perform model_id
model = ObjectSpace._id2ref model_id
model.update_attributes! { data_key: "data value" }
end
end
AwesomeWorker.perform_async AwesomeModel.new.object_id.to_i
Почему мне так важен инвоук модели из воркера? Потому что инвоук инициируется не контроллером, а по времени.
Я правильно выбрал инструменты? Что я делаю не так? Как бы вы решали подобную задачу?