Подтвердить что ты не робот

Что такое набор изменений в phoenix elixir

У меня возникла проблема с пониманием changeset в модели. Что оно делает? Можем ли мы иметь более одного набора изменений в одной модели? например один для создания и другой для обновления.

Может ли кто-то проработать простым способом, чтобы он помог другим людям приехать в Феникс.

4b9b3361

Ответ 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