2015-09-08 13 views

risposta

50

Si desidera utilizzare unique_constraint/3. Questo non è come Active Record perché sta usando il database per garantire l'unicità. Active Record eseguirà una query per i record con lo stesso valore e se ne viene restituita una, in caso contrario. Questo ha una condizione di competizione in cui, se viene inserito un valore tra il recupero per controllare l'univocità e l'inserimento del record, si otterranno dati duplicati o si verificherà un errore (a seconda che un indice sia impostato sul database o meno) unique_constraint/3

Una cosa che vale la pena notare è che poiché l'unicità non è nota fino a quando non viene tentato un inserto, il vincolo univoco avverrà dopo le convalide. Non è possibile visualizzare sia gli errori di validazione sia quelli di vincolo a una volta.

il database in uso deve supportare vincoli univoci troppo. non funzioneranno con SQLite. si può leggere di più sul GitHub issue.

In migrazione:

create unique_index(:users, [:email]) 

Poi nel modello:

cast(user, params, ~w(email), ~w()) 
|> unique_constraint(:email) 

Vale la pena notare che Ecto utilizzato per fornire una funzione validate_unique/3 che ha lavorato facendo una query sul database, tuttavia è stato deprezzato a favore di unique_constraint/3 In version 0.16.0

+0

Salve, porta a un altro errore http://stackoverflow.com/q uestions/32468172/ecto-creating-unique-index-failed – ardhitama

+0

Cosa fanno ~ w (email) e ~ w()? – sheldonkreger

+0

La sintassi ~ w (...) crea una lista. http://elixir-lang.org/docs/stable/elixir/Kernel.html#sigil_w/2 – Gazler

Problemi correlati