Ruby on rails Can';t迁移到heroku(Ruby on Rails教程[Michael Hartl]第10章)

Ruby on rails Can';t迁移到heroku(Ruby on Rails教程[Michael Hartl]第10章),ruby-on-rails,ruby,ruby-on-rails-3,heroku,Ruby On Rails,Ruby,Ruby On Rails 3,Heroku,我正在阅读哈特尔书的第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

我正在阅读哈特尔书的第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\u digest\u 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
class CreateUsers
…\u添加\u索引\u到\u用户\u email.rb

    class AddIndexToUsersEmail < ActiveRecord::Migration[5.0]
      def change
        add_index :users, :email, unique: true
      end
    end
class AddIndexToUsersEmail
…\u将\u密码\u摘要\u添加到\u users.rb

    class AddPasswordDigestToUsers < ActiveRecord::Migration[5.0]
      def change
        add_column :users, :password_digest, :string
      end
    end
    class AddRememberDigestToUsers < ActiveRecord::Migration[5.0]
      def change
        add_column :users, :remember_digest, :string
      end
    end
    class AddAdminToUsers < ActiveRecord::Migration[5.0]
      def change
        add_column :users, :admin, :boolean, default: false
      end
    end
类addPasswordDigestUsers …_删除_columns.rb

    class RemoveColumns < ActiveRecord::Migration[5.0]
      def self.up
        remove_column :users, :password_digest_string
      end
    end
class RemoveColumns
…\u将\u记住\u摘要\u添加到\u users.rb

    class AddPasswordDigestToUsers < ActiveRecord::Migration[5.0]
      def change
        add_column :users, :password_digest, :string
      end
    end
    class AddRememberDigestToUsers < ActiveRecord::Migration[5.0]
      def change
        add_column :users, :remember_digest, :string
      end
    end
    class AddAdminToUsers < ActiveRecord::Migration[5.0]
      def change
        add_column :users, :admin, :boolean, default: false
      end
    end
class AddMemberDigestUsers
…\u将\u admin\u添加到\u users.rb

    class AddPasswordDigestToUsers < ActiveRecord::Migration[5.0]
      def change
        add_column :users, :password_digest, :string
      end
    end
    class AddRememberDigestToUsers < ActiveRecord::Migration[5.0]
      def change
        add_column :users, :remember_digest, :string
      end
    end
    class AddAdminToUsers < ActiveRecord::Migration[5.0]
      def change
        add_column :users, :admin, :boolean, default: false
      end
    end
类AddAdminToUsers
$>heroku pg:reset DATABASE
将使heroku上的db:migrate再次干净

在我看来,
AddPasswordDigestUsers
迁移最初看起来是这样的(可能是拼写错误):

您现在可以做什么


要克服这个问题,现在不做很多更改,只需删除
RemoveColumns
迁移(以及提交、推送…等等)。那没关系,我认为这不会损害您的生产或开发环境。

无论这是否解决了问题中的错误,重置数据库都会破坏所有数据。这不是人们应该用来解决迁移问题的方法,尤其是在生产中!是的,我试过了,我甚至创建了一个新的heroku应用程序并尝试迁移到它。迁移文件是否仅负责决定如何构建表?我的应用程序中似乎有其他东西在告诉PG删除该列,尽管它已经不存在了。这个问题只限于heroku,在本地SQLite3上运行良好。@TamerShlash您有什么建议吗?我想我创建了一个迁移来删除不需要的列,然后回滚了创建该列的迁移。现在我无法让postgres停止尝试删除它一开始不知道的列。@C-RAD是的,我想是这样的。如果你在github上有你的应用程序,你可以给我们链接,这样我们就可以看到完整的迁移历史。@TamerShlash听起来不错,很好。我想如果我能找到创建不需要的列的初始迁移的名称,然后再将其添加回去,我应该可以。我把所有的树枝都翻了一遍,想找到它。太棒了。非常感谢。我认为我遇到的问题是,在回滚到以前的迁移之前,我试图删除RemoveColumns迁移。现在就在heroku上运行。谢谢你的帮助!