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

问题描述 投票:0回答:1

当我创建新设备时,新版本将添加到我的图像上传器中。然后我运行一个作业来为每个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
ruby-on-rails-4 carrierwave sidekiq rails-activejob
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.