2016-08-15 1 views
1

Gibt es eine Möglichkeit embeds_many in Ecto ohne ein id/primary_key Feld zu verwenden?Ecto embeds_many ohne ID

Meine Datenbank hängt davon ab, einen eindeutigen Index für dieses Feld zu haben, und das automatische Einfügen von ecto-Schlüsseln bricht diese Anforderung.

Antwort

1

Ja. embeds_many in Postgres endet als ein Array von JSON. Definieren Sie ein Modul, das diese JSON-Daten darstellt, und verwenden Sie in der Definition von embedded_schema @primary_key false. Angenommen, Sie möchten ein Array von Schlüssel/Wert-Paaren in jeder Zeile speichern. Nennen wir sie Tags. Sie könnten das wie unten definieren und Sie hätten keinen generierten Primärschlüssel für jedes Element im Array. Sie könnten ein anderes Feld innerhalb dieses Schemas haben, das auf die für Ihre App sinnvolle Weise ausgefüllt wird.

defmodule MyApp.Tag do 
    use MyApp.Web, :model 

    @primary_key false 
    embedded_schema do 
    field :key, :string 
    field :value, :string 
    end 

    def changeset(struct, params \\ %{}) do 
    struct 
    |> cast(params, [:key, :value]) 
    |> validate_required([:key]) 
    end 
end