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

4 回答 4

4

将列重命名为<attachment>_<attribute>在 Paperclip 中不起作用的其他名称。

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

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

查看这篇文章,讨论为什么遵循一种<attachment>_url方法可能比使用单独的附件模型更好(<attachment>.url):回形针和继承(STI)

于 2012-12-24T17:47:20.967 回答
1

对于使用 S3 或 Google Cloud Storage 的用户,您可能需要按照回形针的文件命名方案将文件移动到新目录。这是一个示例迁移,可以为您指明正确的方向:

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 
于 2016-03-07T04:30:16.980 回答
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

只需尝试迁移,它可能对您有用。添加列名任何相应的列名。

于 2012-12-12T06:02:32.010 回答
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

以上肯定会奏效。并相应地添加您的附件。

于 2012-12-12T06:26:16.140 回答