Carrierwave + Sidekiq动态版本问题,在后台重新创建

时间:2015-04-16 08:13:08

标签: ruby-on-rails-4 carrierwave sidekiq rails-activejob

当我创建新设备时,我的图片上传器会添加新版本。 然后我运行一个作业来为每个MyModel记录重新创建文件。 Sidekiq启动作业,但它不创建文件。 我使用ActiveJob来宣布工作。

此代码:

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

1 个答案:

答案 0 :(得分:0)

我发现Sidekiq / Rails都将代码加载到自己的内存区域,这就是为什么Sidekiq对Rails端引起的类更改一无所知。

在我的解决方案中,我切换到了DelayedJob。它加载了一个实际的Rails上下文。

另外,我可以在MakingNewVersionImagesJob#perform中复制新版本的定义并继续使用Sidekiq。