2017-08-24 2 views
0

Bien que j'appelle le unique_constraint/3 au changeset comme:Pourquoi j'obtiens Ecto.ConstraintError?

def changeset(parent, params \\ %{}) do 
    parent 
    |> cast(params, [:created_at , :parent_type , :mobile_number]) 
    |> unique_constraint(:mobile_number, name: :parents_mobile_number_uindex) 

    end 

je reçois toujours l'erreur quand je fais Repo.update! ou Repo.update:

** (exit) an exception was raised: 
    ** (Ecto.ConstraintError) constraint error when attempting to update struct: 

    * unique: parents_mobile_number_uindex 

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 has not defined any constraint. 

     (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:284: anonymous fn/13 in Ecto.Repo.Schema.do_update/4 
     (ecto) lib/ecto/repo/schema.ex:142: Ecto.Repo.Schema.update!/4 
     (myapp) web/controllers/csvs_controller.ex:484: Myapp.CsvsController.parent_insert_or_update/2 
     (myapp) web/controllers/csvs_controller.ex:266: anonymous fn/6 in Myapp.CsvsController.write_ecto_rows_schools/6 
     (myapp) web/controllers/csvs_controller.ex:219: Myapp.CsvsController.write_ecto_rows_schools/6 
     (elixir) lib/task/supervised.ex:85: Task.Supervised.do_apply/2 
     (elixir) lib/task/supervised.ex:36: Task.Supervised.reply/5 
     (stdlib) proc_lib.erl:247: :proc_lib.init_p_do_apply/3 

Toute idée?

EDIT:

J'ai déjà la contrainte dans le DB: enter image description here

EDIT2: enter image description here

Répondre

0

Le Ecto.ConstraintError a eu lieu très probablement en raison du nom de contrainte incorrecte sur la base votre message d'erreur "Le changeset n'a défini aucune contrainte."

Vous avez transmis un nom d'index explicite à unique_constraint. Ainsi, le ecto cherchera index unique "parents_mobile_number_uindex"

create unique_index(:parents, [:mobile_number]) 
# geneated a unique index "parents_mobile_number_index" 

Deux choses à regarder:

  1. assurez-vous que le nom d'index unique est correct:

    ## at your migration file 
    create unique_index(:parents, [:mobile_number], name: : parents_mobile_number_uindex) 
    
    ## at your schema module. 
    def changeset(parent, params \\ %{}) do 
        parent 
        |> cast(params, [:created_at , :parent_type , :mobile_number]) 
        |> unique_constraint(:mobile_number, name: : parents_mobile_number_uindex) 
    end 
    
  2. assurez-vous que vous avez appelé la fonction unique_constraint/3:

    parent |> Parent.changeset(%{mobile_number: parent_model.mobile_number}) |> Repo.update() 
    # or 
    parent |> Ecto.Changeset.change(mobile_number: parent_model.mobile_number) |> unique_constraint(:mobile_number, name: :parents_mobile_number_uindex) |> Repo.update() 
    
+0

Merci, mais la contrainte déjà dans la DB, s'il vous plaît vérifier l'édition ci-dessus – simo

+0

intéressant. pourriez-vous me montrer le code autour de "web/controllers/csvs_controller.ex: 484" – jccf091

+0

Veuillez vérifier EDIT2 ci-dessus – simo