Qu'est-ce qu'un changeset dans Phoenix elixir

J'ai du mal à comprendre le changeset dans le modèle. Ce qu'il fait? Peut-on avoir plus d'un ensemble de modifications dans un seul modèle? par exemple, un pour créer et un autre pour mettre à jour.

Quelqu'un peut-il élaborer d'une manière simple afin d'aider d'autres personnes à venir à Phoenix.

31
demandé sur Mario Zigliotto 2015-10-17 14:55:56

2 réponses

De la documentation :

Les Changesets permettent le filtrage, le casting, la validation et la définition des contraintes lors de la manipulation des modèles..

Il y a un exemple de travail avec changesets dans la documentation d'introduction dans le module Ecto. Les fonctions change / 2 et cast / 4 sont les points d'entrée habituels pour créer des ensembles de modifications, tandis que les fonctions restantes sont utiles pour les manipuler.

Les Changesets sont utilisés pour créer et modifier vos modèles. Un ensemble de modifications est littéralement une structure qui stocke un ensemble de modifications (aussi bien que les règles de validation.) Vous passez un ensemble de modifications à votre dépôt Ecto pour conserver les modifications si elles sont valides.

La branche maître actuelle D'Ecto supprime une conversion implicite lors du passage d'un modèle au Repo lors de la mise à jour, ce qui signifie que l'utilisation d'un ensemble de modifications est la seule façon de mettre à jour un modèle.

Depuis le changelog:

Étant donné un modèle à Repo.update / 2 a été déprécié tel quel inneffective et sujette aux erreurs car les modifications ne peuvent pas être suivies

En termes d'avoir plusieurs changesets par modèle, la réponse est certainement Oui. Un ensemble de modifications est simplement une fonction. En fait, vous n'avez même pas besoin de pour mettre les fonctions changeset dans vos modèles, mais c'est un endroit commun pour les mettre.

Si vous avez besoin de plus de champs lors de l'enregistrement d'un utilisateur que de mettre à jour un utilisateur, vous pouvez définir unregister_changeset et un create_changeset avec différents champs obligatoires.

22
répondu Gazler 2015-10-17 14:01:02

Si vous êtes un peu familier avec Rails, ActiveRecord centralise l'accès à la base de données, la génération de requêtes et la validation dans vos modèles, Ecto divise ces responsabilités en modules distincts.

Les méthodes ActiveRecord sont exécutées dans la classe ou l'instance du modèle, tandis Qu'Ecto s'attend à ce que vous transmettiez un modèle, une requête ou un ensemble de modifications à ses fonctions.

Ecto utilise le changeset pour effectuer des validations, plutôt que de traiter les validations à l'intérieur du modèle.

Ecto révisions fournir à la fois des validations et des contraintes qui sont finalement transformées en erreurs en cas de problème.

La différence entre eux est que les validations peuvent être exécutées sans avoir besoin d'interagir avec la base de données et, par conséquent, sont toujours exécutées avant de tenter d'insérer ou de mettre à jour l'entrée dans la base de données.

Cependant, les contraintes ne peuvent être vérifiées de manière sûre que lors de l'exécution de l'opération dans la base de données. En conséquence, les validations sont toujours vérifiées avant de contraintes. Les contraintes ne seront même pas vérifiées en cas d'échec des validations.

Voyons un exemple:

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

Dans la fonction changeset/2 ci - dessus, nous définissons deux validations-une pour vérifier le format e - mail et une autre pour vérifier l'âge-ainsi qu'une contrainte unique dans le champ e-mail.

Supposons que l'e-mail soit donné mais que l'âge soit invalide. Le jeu de modifications aurait les erreurs suivantes:

changeset = User.changeset(%User{}, %{age: 0, email: "mary@example.com"})
{:error, changeset} = Repo.insert(changeset)
changeset.errors #=> [age: "is invalid"]

Dans ce cas, nous n'avons pas vérifié la contrainte unique dans le champ e-mail parce que les données n'ont pas été validées. Fixons l'âge et supposons, cependant, que l'e-mail existe déjà dans la base de données:

changeset = User.changeset(%User{}, %{age: 42, email: "mary@example.com"})
{:error, changeset} = Repo.insert(changeset)
changeset.errors #=> [email: "has already been taken"]

Les Validations et les contraintes définissent une limite explicite lorsque la vérification a lieu. En déplaçant les contraintes vers la base de données, nous fournissons également un moyen sûr, correct et sans course de données de vérifier l'entrée de l'utilisateur.

, Vous pouvez trouver plus de détails ici Ecto Changement de Set

16
répondu Subhash Chandra 2016-05-01 08:25:35