2012-03-27 157 views
17

我正在通过rails tutorial并且陷入困境。在清单8.16我已经做了以下修改开始<timestamp>_add_remember_token_to_users.rbrake db:migrate无法正常工作

class AddRememberTokenToUsers < ActiveRecord::Migration 
    def change 
    add_column :users, :remember_token, :string 
    add_index :users, :remember_token 
    end 
end 

然后指导说要更新开发&测试数据库和往常一样:

$ bundle exec rake db:migrate 
$ bundle exec rake db:test:prepare 

我的用户测试的* remember_token *仍然因此我使用命令行sqlite3在dev和test数据库中查看了用户表。他们看起来像这样:

sqlite> .schema users 
CREATE TABLE "users" (
    "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
    "name" varchar(255), 
    "email" varchar(255), 
    "created_at" datetime NOT NULL, 
    "updated_at" datetime NOT NULL, 
    "password_digest" varchar(255)); 
CREATE UNIQUE INDEX "index_users_on_email" ON "users" ("email"); 

这似乎是我的迁移尚未运行,但我不知道如何强制它运行。

+0

rake任务的输出是什么? – jdl 2012-03-27 19:47:12

+0

如果你的意思是运行bundle exec rake db之后有什么输出:migrate - 没有输出,只是一个新提示。 – hippeelee 2012-03-27 20:01:46

回答

42

尝试重建你的数据库结构(警告:所有DB-数据都将丢失):

rake db:drop:all 
rake db:create:all 
rake db:migrate 

如果您使用Rails的< 4.1,别忘了准备测试数据库:

rake db:test:prepare 

这是最简单的解决方案,因为您正在使用教程。但是在生产中或者正在开发重要数据时,您应该花时间调查问题。在这种情况下,您很可能创建了一个空迁移,运行rake db:migrate,然后向迁移添加了说明,因此您不会看到新的字段,并且rake db:migrate不会执行任何操作。要解决此问题,您需要评论您的change说明,执行rake db:rollback,取消注释说明,然后rake db:migrate应用您错过的说明。

+0

这确实解决了我的数据库问题。谢谢。尽管如此,我的所有测试都开始失败,直到我记得重新运行$ bundle exec rake db:test:prepare – hippeelee 2012-03-27 20:22:49

+0

这有效。只需要更新来为Rails 5.1做bundle rails db {...}。实际上,bundle exec部分甚至可以是可选的。 – VisWebsoft 2017-12-04 18:46:02

2

回滚,然后重新运行它可能工作的迁移。

 rake db:rollback 

回滚后再次运行您的迁移。

4

我和最初的问题有同样的问题。 $ bundle exec rake db:migrate没有在.db中添加remember_token,Latha Doddikadi的答案对我有效。

我所做的:

rake db:rollback 

然后:

$ bundle exec rake db:migrate 

其中添加了remember_token场到数据库,然后:

bundle exec rspec spec/models/user_spec.rb 

其通过。

Finished in 0.92841 seconds 
21 examples, 0 failures