2017-07-17 48 views
0

时约束错误冉以这种迁移到具有唯一索引帐号凤凰外生独特的验证:在试图插入结构

def change do 
    create unique_index(:users, [:account_number]) 
    end 

然后在模型:

def changeset(struct, params \\ %{}) do 
    struct 
    |> cast(params, [:first_name, :last_name, :email, :phone, :city, :postal_code, :country, :login_count, :last_login, :active, :account_number, :password]) 
    |> validate_required([:first_name, :last_name, :email, :phone, :city, :postal_code, :country, :account_number]) 
    |> validate_length(:password, min: 8, max: 100) 
    |> validate_format(:email, ~r/@/) 
    |> unique_constraint(:email) 
    |> unique_constraint(:account_number) 
    |> put_pass_hash() 
    end 

生成此错误:

** (Ecto.ConstraintError) constraint error when attempting to insert struct: 

    * unique: users_account_number_index 

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. 

的PostgreSQL 9.6
凤凰1.2.4
Ecto 2.1.4

我在想什么?

+0

'的变更没有定义任何constraint.'很奇怪。你确定这个'changeset'函数在'User'模型中,并且你插入了这个函数返回的Changeset吗? – Dogbert

+0

那一切都编译好了吗? –

回答

0

您当前的代码使用 Ecto.Changeset.unique_constraint/2 错误说,你应该使用Ecto.Changeset.unique_constraint/3这意味着你必须添加的选项。在这种情况下,只需用message选项键

变化

|>unique_constraint(:account_number)

添加约束错误消息

|>unique_constraint(:account_number, message: "Account number must be unique or some message like that")