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

时间:2019-03-06 16:26:45

标签: ruby-on-rails amazon-s3 seed rails-activestorage

我在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

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

  • 首先,有可能吗?
  • 如果可以,我该如何继续?

1 个答案:

答案 0 :(得分:0)

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

我在下面修改了您的seed.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凭证设置为环境变量,因此您无需公开访问映像。