Heroku Rails迁移声明现有列不存在

时间:2013-11-16 01:01:21

标签: ruby-on-rails ruby heroku

在本地计算机上运行的迁移在Heroku上失败。错误如下:

Migrating to ChangeTypeToCast (20131112072808)
==  ChangeTypeToCast: migrating ===============================================
-- add_column(:math_tests, :cast, :string)
   -> 0.1006s
-- add_column(:emotional_tests, :cast, :string)
   -> 0.1541s
-- remove_column(:math_tests, :type, :string)
rake aborted!
An error has occurred, this and all later migrations canceled:

PG::Error: ERROR:  column "string" of relation "math_tests" does not exist
: ALTER TABLE "math_tests" DROP "string"/

迁移正在删除由早期迁移创建的列。当前和早期的迁移都列在下面:

type

中创建math_tests
class CreateMathTests < ActiveRecord::Migration
  def change
    create_table :math_tests do |t|
      t.string :type

      t.timestamps
    end
  end
end

删除type中的math_tests列(Heroku在第一个remove_column行失败)

class ChangeTypeToCast < ActiveRecord::Migration
  def up
    add_column :math_tests, :cast, :string
    add_column :emotional_tests, :cast, :string
    remove_column :math_tests, :type, :string
    remove_column :emotional_tests, :type, :string
  end

  def down
    remove_column :math_tests, :cast, :string
    remove_column :emotional_tests, :cast, :string
    add_column :math_tests, :type, :string
    add_column :emotional_tests, :type, :string
  end
end

为什么会发生这种情况?

注意:正在运行heroku restartheroku pg:reset无效

1 个答案:

答案 0 :(得分:1)

我猜你正在运行与Heroku实例不同的Rails版本。

在某些版本中,您可以在删除列时指定列的类型,从而允许删除要反转的列。在其他情况下,您可以指定要从中删除列的表,然后传递要从中删除的列名列表。因此,它不是试图删除名为'type'类型'string'的列,而是尝试删除列'type'以及列'string'。

相关发行说明 - http://guides.rubyonrails.org/4_0_release_notes.html#active-record