Почему уникальные противопоказания не работают в Ecto? - PullRequest
1 голос
/ 03 апреля 2020

У меня в модели User есть следующее:

  def changeset(user, attrs) do
    user
    |> cast(attrs, [:login, :email])
    |> validate_required([:login, :email])
    |> unique_constraint(:login)
    |> unique_constraint(:email)
  end

Однако просто установка unique_contraint таким способом не работает. Я все еще получаю дубликаты имени входа и электронной почты при тестировании моего контроллера.

Я получил это, но мне пришлось поставить аргумент ключевого слова :unique в true в схеме модели, а также создать уникальный индекс на столбец в миграции.

Разве Ecto не проверяет само ограничение в дополнение к уникальному индексу PostgreSQL? Есть ли смысл добавлять unique_constraint к функции changeset/2?

1 Ответ

3 голосов
/ 03 апреля 2020

Ограничение уникальности работает, полагаясь на базу данных, чтобы проверить, было ли ограничение уникальности нарушено или нет, и, если так, Ecto преобразует его в ошибку набора изменений. - Ecto.Changeset.unique_constraint/3

Тем не менее, причина существования unique_constraint/3 состоит в том, чтобы унифицировать ошибки (сделать ошибку набора изменений из того, что было получено из БД.) Это, очевидно, облегчает и стандартизирует обработку ошибок.

Ecto, очевидно, не может проверить ограничение самостоятельно, не полагаясь на БД.

...