使用paperclip gem更改列名称

时间:2012-12-12 05:24:02

标签: ruby-on-rails

有没有办法更改回形针在生成数据库迁移时使用的列名?例如,目前回形针迁移如下所示:

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更改为对应于名为“content”的数据库中的列。这可能吗?

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

对于利用S3或Google云端存储的用户,您可能需要将文件移至paperclip的文件命名方案后的新目录中。这是一个示例迁移,指向正确的方向:

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 

答案 2 :(得分: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

尝试迁移可能会对您有用。添加列名称,无论对应的列名称。

答案 3 :(得分: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

以上内容肯定会有用。并按顺序添加附件。