2017-05-09 7 views
0

のためのユニークなcontrantを評価することはできません私は、既存のデータベースを持っていると私はエクト内の任意の移行を持っていけないそのテーブルの一意のインデックスエリクサーでエクトを使用して、これは既存のインデックス

ALTER TABLE ONLY users ADD CONSTRAINT unique_document_id UNIQUE (document_id); 

がある、と私はチェンジセットを使って新しいレコードを挿入したい。ここでは、モデルからコードと

defmodule User do 
    use Ecto.Schema 

    schema "users" do 
    field :name 
    field :email 
    field :document_id 
    end 

    def signup(name, id_number, email) do 
    changeset = User.changeset(%User{}, %{name: name, 
              email: email, 
              document_id: id_number}) 

    if changeset.valid? do 
     IO.inspect "the chagenset is valid" 
     user = case Repo.insert(changeset) do 
     {:ok, model}  -> {:ok, model } 
     {:error, changeset} -> {:error, changeset.errors} 
     end 
    end 


def changeset(driver, params \\ :empty) do 
    driver 
    |> cast(params, [:document_id, :email, :name]) 
    |> validate_required([:document_id, :email, :name]) 
    |> unique_constraint(:document_id) 
    |> unique_constraint(:email) 
    end 


    end 

end 

を挿入するためのコードがあるしかし、私は重複したユーザーを挿入しようとすると、私はこのエラーを取得し、changeset.valid? (エラーメッセージが言うように、users_document_id_indexされるであろう)、それはデフォルトエクトの規則ではありませんので、あなたがunique_constraintの呼び出しで制約名を指定する必要が真

11:04:17.896 [error] #PID<0.434.0> running App terminated 
Server: localhost:4000 (http) 
Request: POST /api/signup 
** (exit) an exception was raised: 
    ** (Ecto.ConstraintError) constraint error when attempting to insert struct: 

    * unique: unique_document_id 

If you would like to convert this constraint into an error, please 
call unique_constraint/3 in your changeset and define the proper 
constraint name. The changeset defined the following constraints: 

    * unique: users_document_id_index 

     (ecto) lib/ecto/repo/schema.ex:493: anonymous fn/4 in Ecto.Repo.Schema.constraints_to_errors/3 
     (elixir) lib/enum.ex:1229: Enum."-map/2-lists^map/1-0-"/2 
     (ecto) lib/ecto/repo/schema.ex:479: Ecto.Repo.Schema.constraints_to_errors/3 
     (ecto) lib/ecto/repo/schema.ex:213: anonymous fn/13 in Ecto.Repo.Schema.do_insert/4 
     (ecto) lib/ecto/repo/schema.ex:684: anonymous fn/3 in Ecto.Repo.Schema.wrap_in_transaction/6 
     (ecto) lib/ecto/adapters/sql.ex:620: anonymous fn/3 in Ecto.Adapters.SQL.do_transaction/3 
     (db_connection) lib/db_connection.ex:1275: DBConnection.transaction_run/4 
     (db_connection) lib/db_connection.ex:1199: DBConnection.run_begin/3 

答えて

3

です:

|> unique_constraint(:document_id, name: :unique_document_id) 

あなたの場合電子メールのユニークな制約名を持っていて、users_name_indexでない場合は、unique_constraint(:name)でも同じことをする必要があります。

関連する問題