无法迁移到heroku(Ruby on Rails教程[Michael Hartl] chaper 10)

时间:2017-01-22 01:45:51

标签: ruby-on-rails ruby ruby-on-rails-3 heroku

我正在研究Hartl书的第10章。在本章的结尾,我们重置了heroku数据库,然后进行迁移。但是当我跑步时:

heroku run rails db:migrate

我收到错误:

rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:

PG::UndefinedColumn: ERROR:  column "password_digest_string" of relation "users" does not exist
: ALTER TABLE "users" DROP "password_digest_string"

在本教程的前面,我删除了一个名为password_digest_string的列,因为它的名称不正确,我还不需要它。似乎rails试图再次删除该列,即使它不再存在。我删除了删除此列的迁移文件,但它仍然试图删除它。同样奇怪的是,自从删除该列以来我已经多次迁移数据库,并且在重置之前从未遇到过这个问题。有什么建议吗?

编辑:

这是我的架构文件:

ActiveRecord::Schema.define(version: 20170121224748) do 

  create_table "users", force: :cascade do |t| 
    t.string   "name" 
    t.string   "email" 
    t.datetime "created_at",                      null: false 
    t.datetime "updated_at",                      null: false 
    t.string   "password_digest" 
    t.string   "remember_digest" 
    t.boolean  "admin",           default: false 
    t.index ["email"], name: "index_users_on_email", unique: true 
  end 

end

编辑:

我的时间戳顺序迁移。

..._ create_users.rb

    class CreateUsers < ActiveRecord::Migration[5.0]
      def change
        create_table :users do |t|
          t.string :name
          t.string :email 

          t.timestamps
        end
      end
    end

..._ add_index_to_users_email.rb

    class AddIndexToUsersEmail < ActiveRecord::Migration[5.0]
      def change
        add_index :users, :email, unique: true
      end
    end

..._ add_password_digest_to_users.rb

    class AddPasswordDigestToUsers < ActiveRecord::Migration[5.0]
      def change
        add_column :users, :password_digest, :string
      end
    end

..._ remove_columns.rb

    class RemoveColumns < ActiveRecord::Migration[5.0]
      def self.up
        remove_column :users, :password_digest_string
      end
    end

..._ add_remember_digest_to_users.rb

    class AddRememberDigestToUsers < ActiveRecord::Migration[5.0]
      def change
        add_column :users, :remember_digest, :string
      end
    end

..._ add_admin_to_users.rb

    class AddAdminToUsers < ActiveRecord::Migration[5.0]
      def change
        add_column :users, :admin, :boolean, default: false
      end
    end

2 个答案:

答案 0 :(得分:0)

在我看来,AddPasswordDigestToUsers迁移最初看起来像这样(可能是拼错了):

class AddPasswordDigestToUsers < ActiveRecord::Migration[5.0]
  def change
    add_column :users, :password_digest_string
  end
end

然后您意识到该列应该只是password_digest。因此,您手动将迁移文件编辑为现在的样式,回滚,创建下一次迁移RemoveColumns,然后运行迁移。

现在,当您从头开始迁移时,如果您使用sqlite3(这是您用于开发环境的那个),则the way column removal is handled in sqlite将不会出现错误。但是如果你使用Postgres就会出错。

你应该做什么

您应该刚刚创建了一个迁移来更改列名,而不是您所做的,如下所示:

class RenamePasswordDigestStringColumn < ActiveRecord::Migration[5.0]
  def self.up
    rename_column :users, :password_digest_string, :password_string
  end
end

您现在可以做什么

要在不进行多项更改的情况下解决问题,您只需删除RemoveColumns迁移(并提交,推送等等)。那没关系,我认为它不会对你的生产或开发环境造成伤害。

答案 1 :(得分:-1)

$> heroku pg:reset DATABASE将使heroku上的db:migrate再次清理