Что такое набор изменений в phoenix elixir
У меня возникла проблема с пониманием changeset
в модели. Что оно делает? Можем ли мы иметь более одного набора изменений в одной модели? например один для создания и другой для обновления.
Может ли кто-то проработать простым способом, чтобы он помог другим людям приехать в Феникс.
Ответы
Ответ 1
Из документации:
С помощью команд можно фильтровать, кастинг, проверку и определение ограничений при манипулировании моделями.
Существует пример работы с наборами изменений во вводной документации в модуле Ecto. Функции change/2 и cast/4 являются обычными точками входа для создания наборов изменений, в то время как остальные функции полезны для их манипулирования.
Изменения используются для создания и модификации ваших моделей. Набор изменений - это буквально структура, в которой хранится набор изменений (а также правила проверки). Вы передаете набор изменений в ваш Ecto Repo, чтобы сохранить изменения, если они действительны.
Текущая главная ветвь Ecto удаляет неявное преобразование при передаче модели в Repo при обновлении, что означает использование набора изменений только для обновления модели.
Из журнала изменений:
Учитывая, что модель для Repo.update/2 устарела, поскольку она неэффективна и подвержена ошибкам, поскольку изменения не могут быть отслежены
С точки зрения наличия нескольких наборов изменений на модель, ответ, безусловно, да. Набор изменений - это просто функция. На самом деле вам даже не требуется , чтобы поместить функции изменений в ваши модели, однако это обычное место для их размещения.
Если вам требуется больше полей при регистрации пользователя, чем при обновлении пользователя, вы можете определить register_changeset
и create_changeset
с разными обязательными полями.
Ответ 2
Если вы немного знакомы с Rails, ActiveRecord централизует доступ к базе данных, создание запросов и проверку в ваших моделях, Ecto делит эти обязанности на отдельные модули.
Методы ActiveRecord выполняются в классе модели или экземпляре, тогда как Ecto ожидает, что вы передадите модели, запрос или набор изменений в свои функции.
Ecto использует набор изменений для выполнения валидаций, а не рассматривает проверки внутри модели.
Изменения в Ecto предоставляют как проверки, так и ограничения, которые в конечном итоге превращаются в ошибки в случае, если что-то пойдет не так.
Разница между ними заключается в том, что проверки могут выполняться без необходимости взаимодействия с базой данных и, следовательно, всегда выполняются перед тем, как вставлять или обновлять запись в базе данных.
Однако при выполнении операции в базе данных ограничения могут быть проверены безопасным образом. Как следствие, проверки всегда проверяются перед ограничениями. Ограничения обычно не проверяются в случае сбоя проверки.
Давайте посмотрим на пример:
defmodule User do
use Ecto.Schema
import Ecto.Changeset
schema "users" do
field :name
field :email
field :age, :integer
end
def changeset(user, params \\ :empty) do
user
|> cast(params, ~w(name email), ~w(age))
|> validate_format(:email, ~r/@/)
|> validate_inclusion(:age, 18..100)
|> unique_constraint(:email)
end
end
В приведенной выше функции changeset/2
мы определяем две проверки: одну для проверки формата электронной почты и другую для проверки возраста - а также уникальное ограничение в поле электронной почты.
Предположим, что отправлено электронное письмо, но возраст недействителен. Изменения будут иметь следующие ошибки:
changeset = User.changeset(%User{}, %{age: 0, email: "[email protected]"})
{:error, changeset} = Repo.insert(changeset)
changeset.errors #=> [age: "is invalid"]
В этом случае мы не проверяли уникальное ограничение в поле электронной почты, потому что данные не проверялись. Давайте исправим возраст и предположим, однако, что электронная почта уже существует в базе данных:
changeset = User.changeset(%User{}, %{age: 42, email: "[email protected]"})
{:error, changeset} = Repo.insert(changeset)
changeset.errors #=> [email: "has already been taken"]
Проверки и ограничения определяют явную границу при проверке. Перемещая ограничения в базу данных, мы также предоставляем безопасные, правильные и беспроигрышные средства проверки пользовательского ввода.
вы можете найти более подробную информацию здесь Ecto Change Set