mtj*_*hax 9 activerecord ruby-on-rails carrierwave
我有一个Ruby on Rails站点,其中模型使用CarrierWave进行文件处理,目前使用的是本地存储.我想开始使用云存储,我需要将现有的本地文件迁移到云端.我想知道是否有人可以指出这样做的方法?
使用模型属性的加分点,允许我在后台逐行执行此操作,而不会中断我的站点以延长停机时间(换句话说,某些模型行仍然具有本地存储,而其他模型行则使用云存储).
我的第一直觉是为每个使用云存储的模型创建一个新的上传器,所以我在每个模型上有两个上传器,然后将文件从一个传输到另一个,设置一个属性来指示应该使用哪个文件,直到它们全部转移,然后删除旧的上传者.这看起来有点过分了.
最小可能零Donwtime程序
在我看来,最简单,最快速的方法来实现您想要的几乎没有停机时间是这样的:(我将假设您将使用AWS云,但类似的程序适用于任何云服务)
s3cmd
(用于与S3交互的命令行工具)或GUI应用程序,将整个资产文件夹从文件系统复制到S3中的相应文件夹.:fog
存储.不要重新启动您的应用程序.而是调出rails控制台和模型,检查新资产URL是否正确且可按计划访问.例如,对于带有图片资源的视频模型,您可以这样检查:
Video.first.picture.url
Run Code Online (Sandbox Code Playgroud)
这将根据更新的设置为您提供完整的云URL.复制URL并粘贴到浏览器中,以确保您可以正常使用.
如果这适用于具有资产的每个模型的至少一个实例,则可以重新启动应用程序.
重新启动后,您的所有资产都将通过云提供,并且您的模型中不需要任何迁移或多个上传程序.
(基于@Frederick Cheung的评论):使用s3cmd
(或类似的)rsync
或sync
从文件系统到S3的资产文件夹来说明在步骤2和5之间上传的资产(如果有的话).
PS:如果您需要帮助为云存储设置carrierwave,请告诉我们.
我会尝试以下步骤:
rails g migration MigrateFiles
让 Carrierwave 获取当前文件,处理它们并上传到云端。如果您的模型如下所示:
class Video
mount_uploader :attachment, VideoUploader
end
Run Code Online (Sandbox Code Playgroud)
迁移看起来像这样:
@videos = Video.all
@videos.each do |video|
video.remote_attachment_url = video.attachment_url
video.save
end
Run Code Online (Sandbox Code Playgroud)
如果执行此迁移,将会发生以下情况:
Carrierwave 会下载每个图像,因为您为附件指定了远程 URL(当前位置,例如http://test.com/images/1.jpg),并将其保存到云端,因为您在上传器中更改了该 URL。
编辑:
由于 San 指出这不会直接起作用,您可能应该首先创建一个额外的列,运行迁移以将所有视频中的当前attachment_urls复制到该列中,之后更改上传者并使用其中复制的url运行上述迁移新专栏。进行另一次迁移时,只需再次删除该列即可。不是那么干净和容易,但几分钟内就完成了。