2012-12-12 15 views
6

C'è un modo per modificare i nomi di colonna utilizzati da paperclip quando si genera la migrazione del database? Ad esempio, attualmente una migrazione graffetta assomiglia a questo:Modifica dei nomi di colonna con gemma a graffetta

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

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

e genera il seguente nel database:

avatar_file_name 
avatar_file_size 
avatar_content_type 
avatar_updated_at 

Idealmente mi piacerebbe cambiare l'avatar_file_name corrispondere ad una colonna della database chiamato "contenuto". È possibile?

risposta

4

La ridenominazione delle colonne, a qualcos'altro di <attachment>_<attribute> non funziona in Paperclip.

ha bisogno obbligatoriamente i seguenti 4 attributi per ciascun allegato nel modello:

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

controllare questo post per un dibattito sul perché seguire uno <attachment>_url metodo potrebbe essere migliore di avere un modello separato per attacco (<attachment>.url): 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 

Basta provare la migrazione potrebbe essere che funzionerà per voi. aggiungi il nome della colonna indipendentemente dal nome della colonna corrispondente.

+0

Sono d'accordo che sarà sicuramente cambiare i nomi delle colonne, ma sarà graffetta ancora sapere di scrivere a quella colonna nel database dopo che ho rinominarlo? – bswinnerton

+0

Nel tuo modello cambia anche come sotto ** attr_accessible: utente has_attached_file: user,: styles => {: medium => "300x300>",: thumb => "100x100>"} e visualizza <% = f.file_field :% utente e ** cambiano anche ** utente ** anziché ** avatar **. Funzionerà. –

+0

Ma di nuovo. Come posso cambiarlo da qualcosa di simile: user_file_name a: content, e ho ancora paperclip sapere che cosa intendo è _file_name? – bswinnerton

0

Quando si esegue rails g migration add_avatar_columns_to_users, è possibile scrivere come è stato scritto. Ma se vuoi cambiare i nomi delle colonne, vai al file di migrazione e cambialo come vuoi come segue. Si prega di non migrare fino a quando non si cambiano le colonne.

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 


Ora gestiscono rake db:migrate

È possibile che questo funzionerà di sicuro. E aggiungi i tuoi allegati in modo conforme.

+0

Ma paperclip saprà ancora scrivere in quella colonna nel database se non termina in _file_name? – bswinnerton

1

Per gli utenti che S3 leva o Google Cloud Storage, potrebbe essere necessario spostare i file in una nuova directory seguente sullo schema di denominazione di file di graffetta. Ecco una migrazione di esempio per puntare nella giusta direzione:

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 
Problemi correlati