2016-09-04 1 views
0

Ich habe ein paar Felder in einem Ecto-Modell, für das ich a) Standardwert einfügen möchte b) Wert generieren, wenn ich eine Einfügung mache. Wie kann ich das machen? In welcher Funktion soll ich das tun, in "changeset"?Wie kann ich einige Werte in einem Ecto-Modell auf Einfügen setzen

+1

Können Sie ein konkretes Beispiel geben? Der Standardwert kann mit der Option ': default' in https://hexdocs.pm/ecto/Ecto.Schema.html#field/3 festgelegt werden. Dieser Wert wird jedoch zur Kompilierzeit ausgewertet, so dass Sie beispielsweise Ecto.DateTime nicht verwenden können .utc'. – Dogbert

Antwort

3

Ja, der übliche Ort für solche Dinge ist die Changeset-Funktion. Wenn Sie unterscheiden müssen, was beim Einfügen und Aktualisieren passiert, können Sie mehrere Changeset-Funktionen definieren und beim Aktualisieren oder Einfügen der Daten die entsprechende Funktion aufrufen. Zum Beispiel:

defmodule MyApp.Schema do 
    #... 

    def insert_changeset(struct, params) do 
    struct 
    |> common_changeset(params) 
    |> put_change(:foo, "bar") # writing a field to the changeset 
    # ... 
    end 

    def update_changeset(struct, params) do 
    struct 
    |> common_changeset(params) 
    # ... 
    end 

    defp common_changeset(struct, params) do 
    struct 
    |> cast(params, [:foo, :bar]) 
    # ... 
    end 
end 

Wenn der Standardwert statisch ist, können Sie auch default: Wahl des Ecto für das field/3 Makro im Schema verwenden - es gleichwertig ist einen Wert für ein Feld in der defstruct Erklärung zu bieten.

+0

Was ist der Unterschied zwischen put_change und update_change? put_change kann auch einen Wert wie update_change aktualisieren. – darko

+0

Es ist der gleiche Unterschied wie zwischen 'Map.put/3' und' Map.update! /3' - der erste nimmt einen neuen Wert an, der zweite nimmt eine Funktion, die den alten Wert in einen neuen umwandelt. – michalmuskala

+0

put_change kann einfügen, wenn es nicht existiert und einen Wert aktualisieren, wenn es existiert, oder? – darko

Verwandte Themen