2016-06-26 2 views
0

Есть ли способ получить уникальное ограничение для встроенной схемы?Уникальное ограничение со встроенной схемой

Данный код ниже дает исключение:

не может добавить ограничение на набор изменений, поскольку он не имеет источник

поле name происходит от схемы persons и поля email от accounts

Схема:

embedded_schema do 
    field :name 
    field :email 
end 

набор изменений:

struct 
    |> Ecto.Changeset.cast(params, [:name, :email]) 
    |> Ecto.Changeset.validate_required([:name, :email]) 
    |> Ecto.Changeset.unique_constraint(:email) 

Я попытался дать схему accounts в качестве параметра, но без успеха.

+0

Можете ли вы разместить код для своего модуля, пожалуйста? Вам нужно было установить 'use App.Web,: model'? – Mohamad

ответ

1

Есть ли способ получить уникальное ограничение для встроенной схемы?

Короткий ответ - нет.

Ecto's unique_constraint основывается на базе данных. Чтобы работать, вам нужно добавить уникальный индекс для данного поля. Ограничение приведет только к преобразованию ошибки базы данных в ошибку набора изменений. Вы можете прочитать в документации https://hexdocs.pm/ecto/Ecto.Changeset.html#unique_constraint/3

Edit:

Использование embedded_schema означает, что вы не можете иметь уникальный индекс на «поле» email, потому что это не само поле. Ecto использует одно поле jsonb для хранения встроенных данных.

Вы можете создать схему Account, которая относится к базе данных. Затем вы можете вручную сопоставить данные в наборе изменений учетной записи и использовать на нем unique_constraint.

+0

Он не хранится как JSON. Поле 'name' хранится в таблице' people', а поле 'email' хранится в таблице' accounts'. Поэтому я подумал, что могу использовать ограничение для этого. Небольшая справочная информация: я пытаюсь использовать 'insert_all' (http://blog.plataformatec.com.br/2016/05/ectos-insert_all-and-schemaless-queries/), поэтому я создал форму для создания нового человека 'с некоторыми учетными данными, такими как 'email'. – Hatsjoem

+1

Я вижу. Тем не менее вы не можете иметь 'unique_constraint' в этом наборе изменений, потому что его схема не связана с базой данных. Вы можете определить схему «Учетная запись» и иметь «unique_constraint» в наборе изменений учетной записи. Таким образом, вам придется вручную сопоставить данные с набором изменений 'account', который будет использовать уникальное ограничение. – ventsislaf

+0

То что я собираюсь делать. Но я думал, что был бы способ сделать это, не сопоставив его с моделью 'account' / – Hatsjoem

Смежные вопросы