如果我将视频文件保存到大于5mb的服务器上。我应该创建一个后台作业来保存这个文件吗?
应该怎么做?我的视频模型有标题,说明和附件列/字段。所有字段都是必填字段。
在def创建中,我不应该执行“if @ video.save”,而应该执行“如果Resque.enqueue(保存,@ video)”?
我不确定如何做到这一点,因为将参数传递给Resque.enqueue()会将其转换为哈希值。其次,如果Resque.enqueue(Save,@ video)“”,则使用“”,预期为真或假。但是,Resque.enqueue不能返回任何内容。或者我错了吗?
按钮行是。使用具有resque + redis的后台工作程序保存记录的适当方法是什么?
理想情况下,我认为它看起来应该类似于:
def create
@video = Video.new(params[:video])
respond_to do |format|
if Resque.enqueue(Save)
...
end
end
module Save
@queue = :save
def self.perform
video = Video.new(params[:video])
video.save
return true
end
end
你有什么想法?
答案 0 :(得分:1)
再次意识到这种情况。我不认为上传者的意图是延迟工作......想一想。如果上传文件排在第10位,会发生什么。它希望从哪里获取文件?
正如另一位开发人员所引述:“有HTTP请求处理程序和后台进程。您需要在http请求处理程序中处理原始上载,然后您可以启动外部后台进程以将其从本地上传到S3磁盘”。
这意味着,最初运行一些HTTP请求处理程序来处理这些类型的请求是正常的。
希望这能为最终遇到同样问题的用户清除一些内容。
答案 1 :(得分:0)
我会让用户上传UnencodedVideo。然后,在其创建方法上,它启动一个作业来编码视频(使用resque / delayedjobs),这将创建一个视频。
class UnencodedVideo
def after_create
Resque.enqueue(Encoder, this.id)
end
end
class Encoder
def self.perform(unencoded_video_id)
unencoded_video = UnencodedVideo.find(unencoded_video_id)
...
video.save
end
end
class Video
end