Soru Phoenix iksiri bir değişiklik kümesi nedir


Anlamakta sorun yaşıyorum changeset modelde. Bu ne yapar? Tek bir modelde birden fazla değişiklik yapabilir miyiz? Örneğin. biri oluşturmak için ve başka bir güncelleme için.

Birisi basit bir şekilde detaylandırabilir, böylece Phoenix'e gelen diğer insanlara yardımcı olur.


31
2017-10-17 11:55


Menşei




Cevaplar:


İtibaren belgeleme:

Changesetler, modellerin işlenmesinde filtreleme, döküm, doğrulama ve kısıtlamaların tanımlanmasını sağlar.

Ecto modülündeki giriş belgelerinde değişiklik kümeleriyle çalışma örneği vardır. Fonksiyonlar / 2 ve cast / 4 değişimleri oluşturmak için normal giriş noktalarıdır, geri kalan fonksiyonlar ise bunları manipüle etmek için yararlıdır.

Changesetler, modellerinizi oluşturmak ve değiştirmek için kullanılır. Bir değişiklik kümesi kelimenin tam anlamıyla bir depolayan bir yapıdır. değişiklik kümesi (geçerlilik kurallarının yanı sıra). Geçerli olduklarında değişiklikleri devam ettirmek için bir ek seti Ecto Repo'nuza aktarırsınız.

Ecto'nun şu anki ana kolu, bir modeli modelin güncellenmesi için tek yolla bir değişiklik kullanıldığında güncellemede Repo'ya geçirirken örtük bir dönüşümü kaldırır.

Changelog itibaren:

Repo.update / 2'ye bir model verildiğinde, değişiklik izlenemediği için hataya ve hataya eğilimli olduğu için kullanımdan kaldırıldı

Model başına birden fazla değişiklik olması açısından cevap kesinlikle evet. Bir değişiklik kümesi basitçe bir işlevdir. Sen aslında bile gerek modellerde değişiklik fonksiyonları koymak, ancak bunları koymak için ortak bir yer.

Bir kullanıcıyı kaydettirirken bir kullanıcıyı güncelledikten sonra daha fazla alana ihtiyacınız varsa, o zaman birregister_changeset ve bir create_changeset farklı zorunlu alanlar ile.


22
2017-10-17 11:57





Rails'e biraz aşina iseniz ActiveRecord, modellerinizdeki veritabanı erişimini, sorgu üretimini ve doğrulamayı merkezileştirir, bu sorumlulukları ayrı modüllere ayırır.

ActiveRecord yöntemleri model sınıfı veya örneğinde yürütülürken, Ecto bir model, sorgu veya değişiklik kümesini işlevlerine aktarmanızı bekler.

Ecto, model içindeki doğrulamaları ele almak yerine, geçerliliklerini yerine getirmek için değişiklik kümesini kullanır.

Ecto değişiklikleri, bir şeyler ters giderse sonuçta hatalara dönüşen hem doğrulamalar hem de kısıtlamalar sağlar.

Aradaki fark, doğrulamaların veri tabanı ile etkileşime gerek duymadan yürütülebilmesi ve bu nedenle, veri tabanındaki girişi eklemek veya güncellemeye başlamadan önce her zaman yürütülmesidir.

Ancak, kısıtlamalar yalnızca veritabanında işlemi gerçekleştirirken güvenli bir şekilde kontrol edilebilir. Sonuç olarak, onaylar her zaman kısıtlamalardan önce kontrol edilir. Doğrulamaların başarısız olması durumunda kısıtlamalar kontrol edilmez.

Bir örnek görelim:

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

İçinde changeset/2 Yukarıdaki işlev, e-posta alanındaki benzersiz bir kısıtlamanın yanı sıra iki doğrulamayı - e-posta biçimini ve diğerini kontrol etmek için bir tane - kontrol etmek için tanımlarız.

E-postanın verildiğini, ancak yaşın geçersiz olduğunu varsayalım. Değişiklikleri kümesi aşağıdaki hatalara sahip olacaktır:

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

Bu durumda, veriler doğrulanmadığı için e-posta alanındaki benzersiz kısıtlamayı kontrol etmedik. Ancak yaşı düzeltir ve e-postanın veritabanında zaten var olduğunu varsayalım:

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

Doğrulamalar ve kısıtlamalar, kontrol gerçekleştiğinde açık bir sınır tanımlar. Kısıtlamaları veritabanına taşıyarak, kullanıcı girdisini kontrol etmek için güvenli, doğru ve veri yarışması yapmayan bir araç da sağlıyoruz.

Burada daha fazla detay bulabilirsiniz Ecto Değişim Seti


16
2018-05-01 08:25



Changeset parametresine nasıl değer eklenir. Uygulamamda, şu anda oturum açmış olan kullanıcının user_id dosyasına Policy.client_id öğesini ayarlamanız gerekiyor. Bu sunucu tarafı nasıl yapılır? - W.M.