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更新: 移行から一意の制約を削除してアクティブ モデルに追加しても、将来的には問題が発生することに注意してください。

根本的な問題は、データが「悪い」状態にあることです。同じメール アドレスを持つ 2 つの行がある場合 (または、両方のメール アドレスが空白の可能性もあります)、モデル インスタンスを追加した後validates_uniqueness_of :emailUserこれら 2 つの行は無効になります。したがって、それはまだ修正しなければならないデータの問題です。

于 2013-02-08T03:44:44.553 に答える