Ruby on Rails数据库迁移问题 - 列不是唯一的

时间:2014-12-26 11:50:57

标签: ruby-on-rails database-migration

我是Ruby on Rails的新手,我正在按照https://www.railstutorial.org/book/指南了解更多信息。我坚持6.3.3,它告诉我创建一个安全的密码。之前的迁移似乎有效(创建唯一索引并创建安全密码列)。之后,当我尝试运行时:

rake test

它表示测试已中止,我应该运行:

rake db:migrate RAILS_ENV=test

但是当我运行上面的命令时,它会返回:

c:\Sites\sample_app>rake db:migrate RAILS_ENV=test

DL is deprecated, please use Fiddle
== 20141226095217 AddIndexToUsersEmail: migrating =============================
-- add_index(:users, :email, {:unique=>true}) rake aborted! StandardError: An error has occurred, this and all later migrations canceled:

SQLite3::ConstraintException: indexed columns are not unique: CREATE UNIQUE INDEX "index_users_on_email" ON "users" ("email")c:/Si tes/sample_app/db/migrate/20141226095217_add_index_to_users_email.rb:3:in `change' C:in `migrate' Tasks: TOP => db:migrate (See full trace by running task with --trace)

我不明白为什么会这样。我的数据库是空的。

根据要求,迁移文件:

20141226095217_add_index_to_users_email.rb

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

20141226095746_add_password_digest_to_users.rb

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

1 个答案:

答案 0 :(得分:1)

有关完全相同的问题,请参阅https://stackoverflow.com/a/14765346/429758。如前所述,问题不在于迁移,而是在users表中具有email字段的重复值。

由于在运行测试时发生此错误,这意味着测试数据库为用户提供了重复的电子邮件。

Rails教程书使用夹具设置测试数据。用于在测试环境中创建用户的test/fixtures/users.yml文件显示在Listing 6.29中,如下所示:

one:
  name: MyString
  email: MyString

two:
  name: MyString
  email: MyString

这两个以MyString为电子邮件的灯具都是导致迁移失败的原因。更改值以确保两者具有不同的值。

示例:

one:
  name: First User
  email: first@example.com

two:
  name: Second User
  email: second@example.com

修改

回顾Rails教程,Listing 6.30中的下一步是清空test/fixtures/users.yml文件。这是确保不会发生此错误的另一种方法。