簡體   English   中英

鳳凰et劑中的變更集是什么

[英]What is a changeset in phoenix elixir

我在理解模型中的changeset遇到問題。 它能做什么? 一個模型中可以有多個變更集嗎? 例如,一個用於創建,另一個用於更新。

有人可以用一種簡單的方式進行詳細說明,從而幫助其他人來鳳凰城嗎?

文檔中

變更集允許在處理模型時過濾,強制轉換,驗證和定義約束。

Ecto模塊的入門文檔中有一個使用變更集的示例。 函數change / 2和cast / 4是創建變更集的常用入口點,而其余功能對於操作它們非常有用。

變更集用於創建和修改模型。 從字面上看,變更集是一種存儲一組變更 (以及驗證規則)的結構。您可以將變更集傳遞給Ecto Repo,以便在變更有效時將其保留。

當將模型傳遞給更新時的倉庫時,Ecto的當前master分支將刪除隱式轉換,這意味着使用變更集是更新模型的唯一方法。

從變更日志:

給定Repo.update / 2模型已被棄用,因為它無效且容易出錯,因為無法跟蹤更改

就每個模型具有多個變更集而言,答案肯定是肯定的。 變更集只是一個功能。 實際上,您甚至不需要在模型中放置變更集功能,但這是放置它們的常見地方。

如果在注冊用戶時需要比更新用戶更多的字段,則可以定義帶有不同必填字段的register_changesetcreate_changeset

如果您對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: "mary@example.com"})
{:error, changeset} = Repo.insert(changeset)
changeset.errors #=> [age: "is invalid"]

在這種情況下,我們沒有檢查電子郵件字段中的唯一約束,因為數據沒有驗證。 讓我們確定年齡並假設該電子郵件已存在於數據庫中:

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

驗證和約束條件在檢查發生時定義了明確的邊界。 通過將約束移至數據庫,我們還提供了一種安全,正確且無數據爭用的方法來檢查用戶輸入。

您可以在此處找到更多詳細信息Ecto Change Set

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM