2011-07-19 13 views
4

私はs3で多くのファイルの名前を変更しようとしています - 現在のペーパークリップを変更するhas_attached_file:pathstuff/:id_:updated_at_:style.:extensionからstuff/:id_:counter_:style.:extensionまでです。:counterは画像と同じモデルのフィールドです。Rails Paperclip S3は何千ものファイルの名前を変更しますか?

私は、すべてのファイルの名前を変更する方法についてはあまり面倒ではありません。

ちなみに、新しいファイルがレコードに保存されるたびに、私は:counterをインクリメントしていきます。

これは、この投稿時点のRails 3と最新のペーパークリップです。

アイデア?

ありがとうございます!

+0

私はS3バケットを直接編集するためにaws-s3 gemを使用して解決策を進めています。私はそれが動作することを確認した後、私は以下の回答を投稿します....しかし、私はそれができると思います。 :) – wulftone

答えて

5

ここに私のソリューションです:

# This task changes all of the keys from the current format, 
# :id_:image_updated_at_:style, to :id_:image_counter_:style. 
# :image_counter is set arbitrarily at 1, since all records have 
# a default of 1 in that field (until they're updated). 
desc "One-time renaming of all the amazon s3 content for User.image" 

task :rename_s3_files, [:bucket] => :environment do |t, args| 
    require 'aws/s3' 

    cred = YAML.load(File.open("#{Rails.root}/config/s3.yml")).symbolize_keys! 
    AWS::S3::Base.establish_connection! cred 

    bucket = AWS::S3::Bucket.find(args[:bucket]) 

    # Rename everything in the bucket, taking out the timestamp and replacing it with "1" 
    bucket.each do |obj| 
    arr = obj.key.split('_') 
    obj.rename(arr[0] + '_1_' + arr[2]) 
    end 

end 

それはちょうどバケツ内のすべてのファイルを通過し、この新しいスキーマに応じてそれらの名前を変更します。 Paperclipパスの:counterフィールドをデフォルトの1に設定して、新しいファイル名に_1_を設定します。

魅力的な作品です!

1

paperclipのリフレッシュレーキタスクを試してください。私は新しいスタイルを生成するためにそれを使用しました、そして、私はあなたのパスの変更にもそれをピックアップすると思いますか?

https://github.com/thoughtbot/paperclip/wiki/Thumbnail-Generation

+0

これはうまくいくのか分かりません - サムネイルではなくオリジナルの名前を変更する必要があります。 :pathオプションを私が望む形式に変更すると、もちろんファイルは表示されないので、再処理で名前を変更することはできません。 – wulftone

関連する問題