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

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

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


person Murtza    schedule 17.10.2015    source источник


Ответы (2)


Из документации:

Наборы изменений позволяют фильтровать, преобразовывать, проверять и определять ограничения при работе с моделями.

Пример работы с ревизиями есть во вводной документации в модуле Ecto. Функции change / 2 и cast / 4 являются обычными точками входа для создания ревизий, а остальные функции полезны для управления ими.

Наборы изменений используются для создания и изменения ваших моделей. Набор изменений - это буквально структура, в которой хранится набор изменений (а также правила проверки). Вы передаете набор изменений в Ecto Repo, чтобы сохранить изменения, если они действительны.

Текущая основная ветвь Ecto удаляет неявное преобразование при передаче модели в Repo при обновлении, что означает использование набора изменений единственным способом обновить модель.

Из журнала изменений:

Учитывая, что модель Repo.update / 2 устарела, поскольку она неэффективна и подвержена ошибкам, поскольку изменения не могут быть отслежены.

Что касается наличия нескольких наборов изменений для каждой модели, ответ, безусловно, положительный. Набор изменений - это просто функция. На самом деле вам даже не нужно помещать функции набора изменений в свои модели, однако это обычное место для их размещения.

Если при регистрации пользователя вам требуется больше полей, чем при обновлении пользователя, вы можете определить aregister_changeset и create_changeset с разными обязательными полями.

person Gazler    schedule 17.10.2015

Если вы немного знакомы с 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

person Subhash Chandra    schedule 01.05.2016
comment
Как добавить значение в параметр набора изменений. В моем приложении мне нужно установить для Policy.client_id значение user_id текущего пользователя, вошедшего в систему. Как это сделать на стороне сервера? - person W.M.; 20.07.2016