我正在创建一个将执行以下3件事的迁移:创建一个称为images
的表,将所有图像从products
表转移到新的images
表,然后删除所有图像来自products
表的图像列的
除了传输图像部分外,其他所有功能都起作用。没有图像信息传输。
这是迁移:
class CreateImages < ActiveRecord::Migration
def change
create_table :images do |t|
t.belongs_to :product
t.string :image_file_name, :image_content_type
t.integer :image_file_size
t.boolean :main, :default => false
t.timestamps
end
Product.all.each do |product|
begin
product.images.create(:image => product.image, :main => true)
rescue => e
logger.warn "Error while transferring images from product: #{product.name} to Images: #{e}"
end
end
remove_column :products, :image_file_name
remove_column :products, :image_content_type
remove_column :products, :image_file_size
remove_column :products, :image_updated_at
add_index :images, [:product_id, :main]
end
end
您不应执行文件系统操作,例如activerecord迁移中的文件处理。这主要是因为ActivereCord迁移是在数据库事务中执行的,如果交易文件将不会变更文件。另外,如果您要处理大量文件,则可能会面临与数据库或类似错误的意外连接超时。
您必须在LIB目录内创建一个耙子任务,并在迁移完成后运行。这样的耙任务应首先将文件复制到新的目录,然后删除旧文件。您可能会发现这篇文章很有帮助:http://fernandomarcelo.com/2012/05/paperclip-how-to-move-move-existing-athachments-to-a-a-new-path/。它不是造纸的。
最后,在其他迁移中运行remove_column语句。
class CreateImages < ActiveRecord::Migration
def change
create_table :images do |t|
t.belongs_to :product
t.string :image_file_name, :image_content_type
t.integer :image_file_size
t.boolean :main, :default => false
t.timestamps
end
end
end
手动运行您的任务。
最后,执行以下迁移。
class RemoveImagesFromProducts < ActiveRecord::Migration
def change
remove_column :products, :image_file_name
remove_column :products, :image_content_type
remove_column :products, :image_file_size
remove_column :products, :image_updated_at
add_index :images, [:product_id, :main]
end
end