docs - ¿Qué es un conjunto de cambios en Phoenix elixir
ecto etimologia (2)
De la documentation :
Los conjuntos de cambios permiten filtrar, emitir, validar y definir restricciones al manipular modelos.
Hay un ejemplo de trabajo con conjuntos de cambios en la documentación introductoria en el módulo Ecto. Las funciones change / 2 y cast / 4 son los puntos de entrada habituales para crear conjuntos de cambios, mientras que las funciones restantes son útiles para manipularlos.
Los conjuntos de cambios se utilizan para crear y modificar sus modelos. Un conjunto de cambios es, literalmente, una estructura que almacena un conjunto de cambios (así como las reglas de validación). Usted pasa un conjunto de cambios a su Ecto Repo para conservar los cambios si son válidos.
La rama maestra actual de Ecto elimina una conversión implícita al pasar un modelo al Repo en la actualización, lo que significa que usar un conjunto de cambios es la única forma de actualizar un modelo.
Desde el registro de cambios:
Dado que un modelo para Repo.update / 2 ha sido desaprobado, ya que no es efectivo y es propenso a errores, ya que los cambios no se pueden rastrear.
En términos de tener múltiples conjuntos de cambios por modelo, la respuesta es ciertamente sí. Un conjunto de cambios es simplemente una función. En realidad, ni siquiera necesita poner las funciones de conjunto de cambios en sus modelos, sin embargo, ese es un lugar común para ponerlas.
Si necesita más campos para registrar un usuario que para actualizar a un usuario, puede definir un register_changeset
y un create_changeset
con diferentes campos obligatorios.
Estoy teniendo problemas para entender el changeset
de changeset
en el modelo. ¿Que hace? ¿Podemos tener más de un conjunto de cambios en un solo modelo? por ejemplo, uno para crear y otro para actualizar.
¿Puede alguien elaborar de una manera simple para que ayude a otras personas a venir a Phoenix?
Si está poco familiarizado con Rails, ActiveRecord centraliza el acceso a la base de datos, la generación de consultas y la validación en sus modelos, Ecto divide estas responsabilidades en módulos separados.
Los métodos ActiveRecord se ejecutan dentro de la clase o instancia del modelo, mientras que Ecto espera que usted pase un modelo, una consulta o un conjunto de cambios a sus funciones.
Ecto utiliza el conjunto de cambios para realizar validaciones, en lugar de tratar con validaciones dentro del modelo.
Los conjuntos de cambios Ecto proporcionan tanto validaciones como restricciones que finalmente se convierten en errores en caso de que algo salga mal.
La diferencia entre ellos es que las validaciones se pueden ejecutar sin necesidad de interactuar con la base de datos y, por lo tanto, siempre se ejecutan antes de intentar insertar o actualizar la entrada en la base de datos.
Sin embargo, las restricciones solo se pueden verificar de forma segura al realizar la operación en la base de datos. Como consecuencia, las validaciones siempre se verifican antes de las restricciones. Las restricciones ni siquiera se verificarán en caso de que falle la validación.
Veamos un ejemplo:
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
En la función de changeset/2
anterior, definimos dos validaciones, una para verificar el formato del correo electrónico y otra para verificar la edad, así como una restricción única en el campo del correo electrónico.
Supongamos que se envía el correo electrónico, pero la edad no es válida. El conjunto de cambios tendría los siguientes errores:
changeset = User.changeset(%User{}, %{age: 0, email: "[email protected]"})
{:error, changeset} = Repo.insert(changeset)
changeset.errors #=> [age: "is invalid"]
En este caso, no hemos comprobado la restricción única en el campo de correo electrónico porque los datos no se validaron. Corrigamos la edad y asumamos, sin embargo, que el correo electrónico ya existe en la base de datos:
changeset = User.changeset(%User{}, %{age: 42, email: "[email protected]"})
{:error, changeset} = Repo.insert(changeset)
changeset.errors #=> [email: "has already been taken"]
Las validaciones y restricciones definen un límite explícito cuando ocurre la verificación. Al trasladar las restricciones a la base de datos, también proporcionamos un medio seguro, correcto y libre de carrera de datos para verificar la entrada del usuario.
Usted, puede encontrar más detalles aquí documentation