22

我正在学习 Rails 教程并被卡住了。从代码清单 8.16 开始,我对以下内容进行了修改<timestamp>_add_remember_token_to_users.rb

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* 的用户测试仍然失败,所以我查看了 dev 中的用户表并使用命令行 sqlite3 测试数据库。它们看起来像这样:

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");

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

4

3 回答 3

49

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

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应用您错过的指令。

于 2012-03-27T20:17:46.483 回答
6

我和最初的问题有同样的问题。$ bundle exec rake db:migrate没有将 remember_token 添加到 .db 中,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
于 2012-09-20T01:49:58.153 回答
4

回滚然后重新运行它可能会起作用的迁移。

     rake db:rollback

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

于 2012-03-28T05:22:16.750 回答