方法rename_column不重命名DB中的列

时间:2014-01-31 12:07:38

标签: ruby-on-rails ruby ruby-on-rails-4 rails-migrations

解决!

  

非常感谢。这似乎是移民的冲突   版本。我刚从scheme_migrations表中删除了最后的记录   与列重命名有关。我也删除了所有迁移文件   在与重命名相关的db / migrations中。

我有一张表products_images

class CreateProductsImages < ActiveRecord::Migration
  def change
    create_table :products_images, id: false do |t|
      t.references :product
      t.references :image
      t.integer :position
    end
    add_index :products_images, [:product_id, :image_id]
    add_index :products_images, [:image_id, :product_id]
  end
end

当我尝试开始迁移以将列position重命名为priority时,rails已进行迁移而没有任何错误。但是没有应用数据库表products_images的更改。当然,我可以删除列并使用其他名称创建新列。只是好奇心 - 为什么? DB是SQLite 迁移重命名:
变体1

class RenamePositionToPriority < ActiveRecord::Migration
  def change
    rename_column :products_images, :position, :priority
  end
end

变体2:

class RenamePositionToPriority < ActiveRecord::Migration
  def change
    #rename_column :products_images, :position, :priority
    change_table :products_images do |t|
      t.rename :position, :priority
    end
  end
end

rake db:rollback 输出:

DL is deprecated, please use Fiddle
==  RenamePositionToPriority: reverting =======================================
-- rename_column(:products_images, :priority, :position)
rake aborted!
An error has occurred, this and all later migrations canceled:

Missing column products_images.priorityC:in `migrate'
Tasks: TOP => db:rollback

3 个答案:

答案 0 :(得分:2)

第1步: rails g migration RenameColumn

第二步:之前rake db:在/ db文件夹上迁移打开迁移文件

class RenameColumn&lt; ActiveRecord的::迁移

 def self.up
   rename_column :products_images, :position, :priority
 end

 def self.down
    rename_column :products_images, :priority, :position
end

第3步: rake db:migrate

答案 1 :(得分:0)

class RenamePositionToPriority&lt; ActiveRecord的::迁移

def self.up     rename_column:products_images,:position,:priority     rename_column:products_images,:position,:priority   端

def self.down     rename_column:products_images,:position,:priority     rename_column:products_images,:position,:priority   结束 端

你可以试试这次迁移吗

答案 2 :(得分:0)

运行后你有什么机会'改变'迁移代码吗?只是为了澄清一些事情:Rails无法“记住”您通过迁移所做的一系列更改。它只创建一个名为schema_migrations的表,其中包含version列。基本上,此表包含一个版本列表(用于标识迁移)。