با درود خدمت دوستان و اساتید محترم . امروز در changeset به یک مشکلی برخورد کردم که متوجه شدم افراد دیگر نیز در اینترنت همچنین مشکلی را دارند . ولی متاسفانه را راه حل هاشون نتونستم حل کنم .
مشکل از آنجا شروع می شود که ما یک فیلد از دیتابیس را unique
می کنیم و همینطور آن را ایندکس می نماییم.
به صورت مثال به شرح زیر :
def change do
create table(:usersinfo, primary_key: false) do
.....
end
create index(:usersinfo, [:email], concurrently: true, name: :index_of_users_unique_email, unique: true)
end
کد های بالا در میگریشن من نوشته شده است . خوب تا اینجا مشکلی وجود ندارد و من یک ایندکس یونیک درست کردم و حالا زمان این هست که من در فایل schema خودم در changeset آن بیایم اگر ایمیلی تکراری بود جلوشو بگیرم و اروری در changeset قرار بگیرد .
کد به صورت زیر می باشد ( در خط آخر من این کارو کردم )
def changeset(struct, params \\ %{}) do
struct
|> cast(params, [:full_name, :email, :password, :last_ip, :group_acl, :language, :country])
|> validate_required([:full_name, :email, :password, :last_ip, :group_acl,:language, :country])
|> validate_format(:email, ~r/@/)
|> unique_constraint(:email, name: :PRIMARY)
end
ولی در اینجا ارور زیر را می دهد
** (Ecto.ConstraintError) constraint error when attempting to insert struct:
* unique: index_of_users_unique_email
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: PRIMARY
من سعی کردم حتی در ارور این فانکشن رو پیگیری کنم و حالت مناسبی رو در بیارم تا کدم کار کنه ولی متاسفانه نتونستم و ارور هنوز پابرجاست
مطلبی در این رابطه
با تشکر