我如何创建一个导轨迁移,将所有图像从一个表转移到另一个表



我正在创建一个将执行以下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

相关内容

  • 没有找到相关文章

最新更新