Bir Ecto modelinde benzersiz bir alana sahip olmak isterim. Bu alan kolayca oluşturabileceğim rastgele bir dize içermelidir (örneğin, bkz here). Bununla birlikte, dizgenin oluşturulmasından kaçınmak ve veri tabanında zaten mevcut olup olmadığını kontrol etmek istiyorum, bu da beni yarış koşullarına maruz bırakacaktı.Ecto modeline rastgele ve benzersiz bir alan ekleme
Benzersiz bir dize bulunana kadar yeniden yerleştirmeyi yeniden denemek isterim. Ama nasıl yaparım? changeset/2
işlevinin içinde mi olmalı?
defmodule LetsPlan.Event do
use LetsPlan.Web, :model
schema "events" do
field :name, :string
field :from, Ecto.DateTime
field :to, Ecto.DateTime
field :slug, :string
timestamps
end
@required_fields ~w(from to)
@optional_fields ~w(slug)
def changeset(model, params \\ :empty) do
model
|> cast(params, @required_fields, @optional_fields)
|> unique_constraint(:slug)
end
end
Evet, diğer alanlar hazır olduğunda 'in changeset' fonksiyonu ve controller içerisinde sınırlaması var, sümüklü böcek üretmek , değişiklikleri setine koyun ve kaydetmeyi deneyin. Sonra üç durumda a) a) o çalıştı -> devam b) slug hakkında changeset.error -> yinelemeli sümüklü üretmek için kendini çağır ve tekrar deneyin c) diğer hatalar -> GUI içinde ele veya mevcut. – tkowal
@tkowal Tamam, anladım ama bir sorum var: hatalar arasında nasıl ayrım yapabilirim? Örneğin, ek bilginin sümük nedeniyle başarısız olduğunu veya başka hatalar olduğundan nasıl anlarım? – rubik
@tkowal Nevermind. Ecto'nun kaynak kodunu okudum ve hataların "changeset.error" dizinine yerleştirildiğini gördüm. Sen söyledin ama daha önce anlamadım. – rubik