Ich möchte ein eindeutiges Feld in einem Ecto-Modell haben. Dieses Feld sollte eine Zufallszeichenkette enthalten, die ich leicht erzeugen kann (siehe zB here). Allerdings möchte ich es vermeiden, die Zeichenkette zu generieren und zu überprüfen, ob sie bereits in der Datenbank vorhanden ist, da dies mich den Rennbedingungen aussetzen würde.Hinzufügen eines zufälligen und eindeutigen Felds zu Ecto-Modell
Ich möchte es Insertion wiederholen versuchen, bis eine eindeutige Zeichenfolge gefunden wird. Aber wie mache ich es? Sollte es in der changeset/2
Funktion sein?
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
Ja, haben die Einschränkung in 'changeset' Funktion und in dem Controller, wenn andere Felder sind bereit, erzeugen die Schnecke , setze es in den Änderungssatz und versuche es zu speichern. Dann auf drei Fälle übereinstimmen a) es hat funktioniert -> weiter b) changeset.error über slug -> rekursiv sich selbst aufrufen, um slug zu generieren und es erneut zu versuchen c) andere Fehler -> handle oder in GUI präsentieren. – tkowal
@tkowal Ok, ich habe es aber ich habe eine Frage: Wie unterscheide ich zwischen Fehlern? Zum Beispiel, woher weiß ich, dass die Einfügung wegen des Slugs fehlgeschlagen ist oder weil andere Fehler aufgetreten sind? – rubik
@tkowal Nevermind. Ich habe Ectos Quellcode gelesen und festgestellt, dass Fehler in 'changeset.error' stehen. Du hast es gesagt, aber ich habe es vorher nicht verstanden. – rubik