Elixir ecto 2 erstelle viele_zu_viele Assoziationen
Wie kann ich mit ecto 2 viele zu viele Beziehungen eingehen? Als Beispiel-App möchte ich einen Beitrag erstellen, der in mehrere Kategorien unterteilt werden kann. Die Kategorien existieren bereits. Beispielsweise
[%Category{id: "1", name: "elixir"}, %Category{id: "2", name: "erlang"}]
Im verwendet Ecto 2 Beta 0. Das Beispielprojekt heißt Ecto2.
Ich habe zwei Modelle definiert:
defmodule Ecto2.Post do
use Ecto2.Web, :model
use Ecto.Schema
schema "posts" do
field :title, :string
many_to_many :categories, Ecto2.Category, join_through: "posts_categories", on_replace: :delete
timestamps
end
@required_fields ~w(title)
@optional_fields ~w()
def changeset(model, params \\ :empty) do
model
|> cast(params, @required_fields, @optional_fields)
|> cast_assoc(:categories) # not suitable?
end
end
defmodule Ecto2.Category do
use Ecto2.Web, :model
schema "categories" do
field :name, :string
timestamps
end
@required_fields ~w(name)
@optional_fields ~w()
def changeset(model, params \\ :empty) do
model
|> cast(params, @required_fields, @optional_fields)
end
end
Ich habe versucht, es so zu machen:
post = Repo.get!(Post, 1) |> Repo.preload(:categories)
changeset = Post.changeset(post, %{"title"=> "bla", "categories"=> [%{id: "1"}]})
Repo.update!(changeset)
Aber cast_assoc in Post.changeset ist für diese Aufgabe nicht geeignet, es soll eine ganz neue Kategorie erstellt werden, anstatt eine zuzuordnen. Was soll ich stattdessen verwenden? build_assoc? In build_assoc-Dokumenten wird jedoch nicht erwähnt, dass dies für many_to_many nützlich ist. Wie benutze ich es? Soll ich build_assoc dann in Post.changeset einfügen oder in einem Phoenix-Controller verwenden.