3

我目前正在研究 michael hartl 的 ruby​​ on rails 3 教程。当我尝试调用 db:migrate 时遇到了这个问题。有人可以帮我弄清楚它为什么会中止。谢谢!

** Invoke db:migrate (first_time) ** Invoke environment (first_time) ** Execute environment ** Invoke db:load_config (first_time) ** Execute db:load_config ** Execute db:migrate == AddEmailUniquenessIndex: migrating ======================================== -- add_index(:users, :email, {:unique=>true}) rake aborted! 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")

代码

class AddEmailUniquenessIndex < ActiveRecord::Migration
  def up
    add_index :users, :email, :unique => true
  end

  def down
    remove_index :users, :email
  end
end

用户代码

# == Schema Information
#
# Table name: users
#
#  id         :integer          not null, primary key
#  name       :string(255)
#  email      :string(255)
#  created_at :datetime         not null
#  updated_at :datetime         not null
#

class User < ActiveRecord::Base
  attr_accessor :password
  attr_accessible :email, :name, :password, :password_confirmation

  email_regex = /\A[\W+\-.]+@[a-z\d\-.]+\.|[a-z]+\z/i

  validates :name, :presence => true,
                   :length => { :maximum => 50 }
  validates :email, :presence => true,
                    :format => { :with => email_regex },
                    :uniqueness => { :case_sensitive => false }
  validates :password, :presence => true,
                       :confirmation => true,
                       :length => { :within => 6..40 }


end
4

1 回答 1

11

您的迁移没有任何问题。该错误仅表示您在 db 中有现有的电子邮件重复数据。

检查您的用户表,为现有行设置唯一电子邮件或删除这些行。然后再次运行迁移。

更新:请注意,即使您从迁移中删除唯一约束并添加validates_uniqueness_of :email到您的活动模型中,问题仍然会在未来吞噬您。

根本问题是您的数据处于“不良”状态。如果您有两行具有相同的电子邮件地址(或者它们也可能都有空白电子邮件),则在为这两行添加validates_uniqueness_of :email模型User实例后将无效。所以它仍然是你必须解决的数据问题。

于 2013-02-08T03:44:44.553 回答