[英]What is a changeset in phoenix elixir
我在理解模型中的changeset
遇到問題。 它能做什么? 一個模型中可以有多個變更集嗎? 例如,一個用於創建,另一個用於更新。
有人可以用一種簡單的方式進行詳細說明,從而幫助其他人來鳳凰城嗎?
從文檔中 :
變更集允許在處理模型時過濾,強制轉換,驗證和定義約束。
Ecto模塊的入門文檔中有一個使用變更集的示例。 函數change / 2和cast / 4是創建變更集的常用入口點,而其余功能對於操作它們非常有用。
變更集用於創建和修改模型。 從字面上看,變更集是一種存儲一組變更 (以及驗證規則)的結構。您可以將變更集傳遞給Ecto Repo,以便在變更有效時將其保留。
當將模型傳遞給更新時的倉庫時,Ecto的當前master分支將刪除隱式轉換,這意味着使用變更集是更新模型的唯一方法。
從變更日志:
給定Repo.update / 2模型已被棄用,因為它無效且容易出錯,因為無法跟蹤更改
就每個模型具有多個變更集而言,答案肯定是肯定的。 變更集只是一個功能。 實際上,您甚至不需要在模型中放置變更集功能,但這是放置它們的常見地方。
如果在注冊用戶時需要比更新用戶更多的字段,則可以定義帶有不同必填字段的register_changeset
和create_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.