2015-04-16 2 views
0

Вот моя проблема. Когда я создаю новое устройство, новая версия добавляется в мой загрузчик изображений. Затем я запускаю задание для воссоздания файлов для каждой записи MyModel. Sidekiq запускает работу, но не создает файлы. Я использую ActiveJob для объявления заданий.Проблема с динамической версией Carrierwave + Sidekiq, воссозданная в backgroud

Этот код

MakingNewVersionImagesJob.perform_later("some_recently_added_device_name") 

отлично работает в консоли после перезагрузки Sidekiq. Я думаю, что Sidekiq не видит изменений MyModel. Я прав? Есть ли какое-нибудь решение здесь?

Примечание: это работает хорошо, когда я делаю это непосредственно в контроллере, а не в фоновом режиме

class BaseImageUploader < CarrierWave::Uploader::Base 
    include CarrierWave::MiniMagick 

    # Config/versions ... 

    def self.add_version(name, width, height) 
    version name do 
     process resize_to_fit: [width, height] 
    end 
    end 
end 


class MyModelImageUploader < BaseImageUploader 
    # blabla 
end 


class MyModel < ActiveRecord::Base 
    #... 
    mount_uploader :image, MyModelImageUploader 
end 


class Device < ActiveRecord::Base 
    after_create :add_uploaders_versions 

    def add_uploaders_versions 
    version = self.name.downcase.to_sym 
    MyModelImageUploader.add_version(version, self.width, self.height) 
    end 
end 


class MakingNewVersionImagesJob < ActiveJob::Base 
    queue_as :regular 

    def perform(version) 
    MyModel.find_each do |record| 
     record.image.recreate_versions!(version.to_sym) 
     record.save! 
    end 
    end 
end 


class DevicesController < ApplicationController 
    #... 
    def create 
    @device = Device.new(device_params) 
    if @device.save 
     MakingNewVersionImagesJob.perform_later(@device.name.downcase) 
     #... 
    end 
    end 
end 

ответ

0

я узнал, что Sidekiq/Rails как код нагрузки, чтобы иметь область памяти, то почему Sidekiq ничего не знает об изменениях класса вызванный на стороне Rails.

В моем решении я переключился на DelayedJob. Он загружает фактический контекст Rails.

Кроме того, я могу дублировать определение новой версии в MakeNewVersionImagesJob # и продолжать использовать Sidekiq.