当我创建新设备时,我的图片上传器会添加新版本。 然后我运行一个作业来为每个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
答案 0 :(得分:0)
我发现Sidekiq / Rails都将代码加载到自己的内存区域,这就是为什么Sidekiq对Rails端引起的类更改一无所知。
在我的解决方案中,我切换到了DelayedJob。它加载了一个实际的Rails上下文。
另外,我可以在MakingNewVersionImagesJob#perform中复制新版本的定义并继续使用Sidekiq。