如何在 RoR 应用程序中从 S3 播种数据库

How to seed database from S3 in a RoR app

我在 S3 的存储桶中加载了图像,我想在我的种子中需要这些文件。

这是我的实际 seed.rb(使用我通过活动存储存储在本地的图像):

require 'faker'

Item.destroy_all

20.times do |i|
    item = Item.create!(
                    title: Faker::Games::Pokemon.name,
                    description: Faker::Lorem.paragraph_by_chars(60, false),
                    price: 5.0)
    item.image.attach(io: File.open("app/assets/images/chatons/#{i}.jpg"), filename: "#{i}.jpg")

end

所以我有两个简单的问题:

是的,可以从 AWS S3 对象存储中的文件播种数据库。您将需要 AWS_SDK for Ruby

我已经在下面修改了您的 seeds.rb 文件:

require 'faker'
require 'aws-sdk-s3' 

s3 = Aws::S3::Resource.new(region: 'us-west-2') # Change this to your region

Item.destroy_all

20.times do |i|
    item = Item.create!(
                    title: Faker::Games::Pokemon.name,
                    description: Faker::Lorem.paragraph_by_chars(60, false),
                    price: 5.0)

    # Create the object to retrieve
    obj = s3.bucket('my-bucket').object('#{i}.jpg')    # change this to your bucket name

    # Get the item's content and save it to local
    obj.get(response_target: 'app/assets/images/chatons/#{i}.jpg')

    item.image.attach(io: File.open("app/assets/images/chatons/#{i}.jpg"), filename: "#{i}.jpg")

end

我相信这可以优化。例如,您可能不需要保存在本地,或者附加图像后可以删除本地版本。

适用于 Ruby 的 AWS 开发工具包文档说明了如何将您的 aws 凭证设置为环境变量,因此您不需要公开访问您的图像。