2012-12-12 8 views
6

データベース移行を生成するときにpaperclipが使用する列名を変更する方法はありますか?例えば、現在のクリップの移動は次のようになります。paperclip gemで列名を変更する

class AddAvatarColumnsToUsers < ActiveRecord::Migration 
    def self.up 
    add_attachment :users, :avatar 
    end 

    def self.down 
    remove_attachment :users, :avatar 
    end 
end 

そして、それはデータベースに次のように生成します。

avatar_file_name 
avatar_file_size 
avatar_content_type 
avatar_updated_at 

理想的には私は列に対応するようにavatar_file_nameを変更したいです「コンテンツ」と呼ばれるデータベース。これは可能ですか?

答えて

4

<attachment>_<attribute>以外の列に名前を変更すると、Paperclipでは機能しません。

  • <attachment>_file_name
  • <attachment>_file_size
  • <attachment>_content_type
  • <attachment>_updated_at

チェック、これは議論のために投稿:

それは強制的モデル内の各取り付けのために、以下の4つの属性を必要としますに従う理由レバレッジS3やGoogleクラウドストレージは、あなたがクリップのファイルの命名方式に、次の新しいディレクトリにファイルを移動する必要があることがユーザーのためにPaperclip and Inheritance (STI)

0
ruby script/generate migration RenameDatabaseColumn 

class RenameDatabaseColumn < ActiveRecord::Migration 
    def self.up 
    rename_column :user, :avatar_file_name, :user_file_name 
    rename_column :user, :avatar_file_size, :user_file_size 
    rename_column :user, :avatar_content_type, :user_content_type 
    rename_column :user, :avatar_updated_at, :user_updated_at  
    end 

    def self.down 
    # rename back if you need or do something else or do nothing 
    end 
end 

ちょうど移行を試行しても問題はありません。対応する列名を列名として追加します。

+0

私はそれは間違いなく列名を変更します同意するが、それでも私はそれの名前を変更した後、データベースにその列への書き込みを知っているクリップのだろうか? – bswinnerton

+0

あなたのモデルでも、以下のように変更されます** attr_accessible:user has_attached_file:user、:styles => {:medium => "300x300" "、thumb =>" 100x100> "}ビュー<%= f.file_field :user%>と** **は**アバター**の代わりに** user **を変更します。それが動作します。 –

+0

しかし、もう一度。私はそれをuser_file_nameからcontentに変更することができますが、paperclipには_file_nameということが分かりますか? – bswinnerton

0

rails g migration add_avatar_columns_to_usersを実行すると、書いたとおりに書くことができます。ただし、列名を変更する場合は、移行ファイルに移動し、必要に応じて変更します。列を変更しない限り、移行しないでください。

class AddAvatarColumnsToUsers < ActiveRecord::Migration 
    def self.up 
    add_column :users, :your_file_name,:string 
    add_column :users, :your_content_type, :string 
    add_column :users, :your_file_size,:integer 
    add_column :users, :yourfile_updated_at,:datetime 
    end 

    def self.down 
    remove_column :users, :your_file_name 
    remove_column :users, :your_content_type 
    remove_column :users, :your_file_size 
    remove_column :users, :yourfile_updated_at 
    end 
end 


は今確実に動作します上記rake db:migrate

を実行します。添付ファイルを添付してください。

+0

しかし、もしそれが_file_nameで終わっていないなら、paperclipはデータベースのその列に書き込むことをまだ知っていますか? – bswinnerton

1

:アプローチは、取り付けのための別のモデル(<attachment>.url)を有するよりも良いかもしれません。ここでは正しい方向にあなたを指すようにサンプルの移行です:

class MovePaperclipAssets < ActiveRecord::Migration                
    def up                           

    storage = Fog::Storage::Google.new google_storage_access_key_id: ENV["GOOGLE_ACCESS_KEY_ID"],      
             google_storage_secret_access_key: ENV["GOOGLE_SECRET_ACCESS_KEY"]    
    bucket = storage.directories.get('bucket-name') 

    bucket.files.each do |file|                      
     if file.key.starts_with?("original/directory")               
     newfile = file.key.gsub("original/directory","new/directory")    
     file.copy('bucket-name', newfile)                
     file.destroy                        
     end                           
    end 
    end                            

    def down  
    storage = Fog::Storage::Google.new google_storage_access_key_id: ENV["GOOGLE_ACCESS_KEY_ID"],      
             google_storage_secret_access_key: ENV["GOOGLE_SECRET_ACCESS_KEY"]    
    bucket = storage.directories.get('bucket-name') 

    bucket.files.each do |file|                      
     if file.key.starts_with?("new/directory")               
     newfile = file.key.gsub("new/directory","original/directory")    
     file.copy('bucket-name', newfile)                
     file.destroy                        
     end                           
    end 
    end  
end 
関連する問題