Грабли прервана, на индекс добавить(:пользователей:электронной почты, {:уникальная=>правда})


В настоящее время я работаю над учебником 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+\-.][email protected][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
1   2  

1 ответ:

С вашей миграцией все в порядке. Ошибка просто означает, что у вас есть существующая электронная почта дублирует данные в БД.

Проверьте таблицу пользователей, установите уникальные сообщения электронной почты для существующих строк или удалите эти строки. Затем снова запустите миграцию.

Update: обратите внимание, что даже если вы удалите уникальное ограничение из миграции и добавите validates_uniqueness_of :email в свою активную модель, проблема все равно съест вас в будущем.

Основная проблема заключается в том, что ваши данные находятся в "плохом" состоянии. Если у вас есть два ряда имея один и тот же адрес электронной почты (или это также возможно, что у них обоих есть пустой адрес электронной почты), после добавления validates_uniqueness_of :email ваш экземпляр модели User для этих двух строк не будет действительным. Так что это все еще проблема с данными, которую вы должны исправить.