2012-12-12 3 views
6

데이터베이스 마이그레이션을 생성 할 때 클립 클립이 사용하는 열 이름을 변경하는 방법이 있습니까? 하여 데이터베이스에 다음클립 클립으로 열 이름 변경

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 개 특성을 필요로를 따르는 이유 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처럼 사용자 has_attached_file : user, : styles => {: medium => "300x300>", : thumb => "100x100>"} 및보기 <% = f.file_field : user %> 및 ** ** ** 아바타 ** 대신 ** user ** ** 변경 효과가있을 것입니다. –

+0

하지만 다시. 어떻게하면 user_file_name에서 content로 변경 될 수 있으며 여전히 clip이 _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에서 끝나지 않으면 데이터베이스의 해당 열에 쓸 수 있습니다. – bswinnerton

1

활용하는 S3 또는 Google 클라우드 스토리지, 당신은 클립의 파일 이름 지정 방식에 다음과 같은 새 디렉토리에 파일을 이동해야 할 수 있습니다 사용자 :방법은 첨부 파일에 대한 별도의 모델 (<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