Грабли прервана, на индекс добавить(:пользователей:электронной почты, {:уникальная=>правда})
В настоящее время я работаю над учебником 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-zd-.]+.|[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 ответ:
С вашей миграцией все в порядке. Ошибка просто означает, что у вас есть существующая электронная почта дублирует данные в БД.
Проверьте таблицу пользователей, установите уникальные сообщения электронной почты для существующих строк или удалите эти строки. Затем снова запустите миграцию.
Update: обратите внимание, что даже если вы удалите уникальное ограничение из миграции и добавите
Основная проблема заключается в том, что ваши данные находятся в "плохом" состоянии. Если у вас есть два ряда имея один и тот же адрес электронной почты (или это также возможно, что у них обоих есть пустой адрес электронной почты), после добавленияvalidates_uniqueness_of :email
в свою активную модель, проблема все равно съест вас в будущем.validates_uniqueness_of :email
ваш экземпляр моделиUser
для этих двух строк не будет действительным. Так что это все еще проблема с данными, которую вы должны исправить.