如何使用ActiveRecord将图像添加到Carrierwave?

时间:2017-01-29 07:30:54

标签: ruby-on-rails ruby amazon-web-services activerecord amazon-s3

我正在创建一个照片Web应用程序。我可以访问亚马逊s3存储桶,其中包含我创建应用所需的所有照片。到目前为止,我已使用AWSCarrierwave正确设置了所有内容,以便将图片上传到云端。但是,我正在努力做相反的事情。我想从s3下载文件并在我的数据库中创建Person个对象。我构建了一个自定义rake任务,试图完成这样的任务。这是rake任务:

desc 'Populate database with person s3 photos'
task migrate_s3_photos_to_db: :environment do
  s3 = Aws::S3::Resource.new(region: ENV['AWS_REGION'], credentials: Aws::Credentials.new(ENV["AWS_SES_ACCESS_KEY"], ENV['AWS_SES_SECRET_ACCESS_Key'])
  s3.bucket(ENV['S3_BUCKET']).objects.each do |person|
    name = person.key.gsub('.jpg', '').gsub('_',' ')
    email = "#{name.scan(/\w+/)[0][0].downcase}" + "#{name.scan(/\w+/)[1].downcase}" + "@gmail.com"

    ===================Problem==========================
    Person.create(name: name, email: email, avatar: ?????????)
  end
end

上述任务的问题在于我不确定我应该放入头像领域。我已经尝试了person.key,这会产生图片名称的字符串(Andy Johnson.jpg)。但这并不起作用。

我还尝试创建了PersonAvatarUploader提供的载波,但我不确定这是否可行。有没有人遇到这样的问题?

1 个答案:

答案 0 :(得分:1)

您应该为每个对象生成一个s3网址,并将其传递给remote_avatar_url属性:

s3_url = person.url_for(:read)
Person.create(name: name, email: email, remote_avatar_url: s3_url)

http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/S3Object.html