有没有办法更改回形针在生成数据库迁移时使用的列名?例如,目前回形针迁移如下所示:
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”的数据库中的列。这可能吗?
答案 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
以上内容肯定会有用。并按顺序添加附件。