如何在 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 凭证设置为环境变量,因此您不需要公开访问您的图像。
我在 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 凭证设置为环境变量,因此您不需要公开访问您的图像。