2012-12-12 22 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中不起作用。

它强制需要以下4个属性为模型中的每个附件:

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

入住此张贴出去辩论为什么跟着<attachment>_url方法可能比有用于连接单独的一个模型(<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 

只是尝试迁移可能会对你有用。为相应的列名添加列名称。

+0

我同意,一定会改变的列名,但仍回形针知道写该列在数据库中的后,我将其重命名? – bswinnerton

+0

在你的模型中,像下面那样改变** attr_accessible:用户 has_attached_file:user,:styles => {:medium =>“300x300>”,:thumb =>“100x100>”}并查看<%= f.file_field :用户%>和**也改变**用户**而不是**头像**。它会工作。 –

+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结尾,回形针是否仍然知道要写入数据库中的该列? – bswinnerton

1

对于杠杆S3或谷歌云存储,你可能需要将文件移动到下面的回形针的文件命名方案,新目录的用户。下面是一个简单的迁移到你指出正确的方向:

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