Ich versuche immer noch zu erraten, wie man mit dem Erstellen/Aktualisieren has_many, through:
Assoziationen in Ecto umzugehen. Ich habe José's Post auf Assoziationen sowie the docs wieder gelesen, aber ich kämpfe immer noch.has_many, durch Assoziationen in Ecto
Was ich habe, ist dies:
web/models/dish.ex
defmodule Mp.Dish do
use Mp.Web, :model
schema "dishes" do
# ...
has_many :dish_dietary_prefs, Mp.DishDietaryPref, on_delete: :delete_all,
on_replace: :delete
has_many :dietary_prefs, through: [:dish_dietary_prefs, :dietary_pref]
end
# ...
end
web/models/dietary_pref.ex
defmodule Mp.DietaryPref do
use Mp.Web, :model
schema "dietary_prefs" do
# ...
has_many :dish_dietary_prefs, Mp.DishDietaryPref, on_delete: :delete_all,
on_replace: :delete
has_many :dishes, through: [:dish_dietary_prefs, :dish]
end
# ...
end
web/Modelle /dish_dietary_pref.ex
defmodule Mp.DishDietaryPref do
use Ecto.Schema
schema "dish_dietary_prefs" do
belongs_to :dish, Mp.Dish
belongs_to :dietary_pref, Mp.DietaryPref
end
end
Ich habe einen JSON Endpunkt, der Parameter für eine Dish
empfängt, in dessen Inneren I einen Schlüssel dietary_prefs
genannt, die als kommagetrennte Zeichenkette übergeben wird, so zum Beispiel:
[info] POST /api/vendors/4/dishes
[debug] Processing by Mp.Api.DishController.create/2
Parameters: %{"dish" => %{"dietary_prefs" => "2,1"}, "vendor_id" => "4"}
(mit zusätzliche Parameter für "dish"
für diese SO Postens enthoben.)
Wie gehe ich in meinem Controller? Insbesondere möchte ich dieses Verhalten:
- Für
POST
Anfragen (Erstellen Aktionen), erstellen die notwendigen Datensätze indish_dietary_prefs
diese neueDish
mit den gegebenenDietaryPref
s zuzuordnen. Die durch Kommas getrennte Zeichenfolge istid
s fürDietaryPref
Datensätze. - Für
PUT/PATCH
Anfragen (Updates), erstellen/zerstören Sie die notwendigen Datensätze indish_dietary_prefs
, um die Assoziationen zu aktualisieren (Benutzer können Gerichte zu verschiedenen Diät-Einstellungen neu zuweisen). - Für
DELETE
Anfragen, zerstörendish_dietary_prefs
. Ich denke, dieser Fall wird bereits mit deron_delete
Konfiguration in den Modellen behandelt.
Ich habe bereits die Logik in meinem Controller/Update Gerichte für einen bestimmten Anbieter zu schaffen (die nur eine einfache has_many/belongs_to
Beziehung ist), aber ich kann immer noch nicht herausfinden, wie/Update erstellen/zerstören diese Assoziationen für ein bestimmtes Gericht.
Jede Hilfe würde sehr geschätzt werden.
Wenn ich "need to receive the IDs and manually build the intermediate association for each"DietaryPref
ich zum Dish
bin zuordnet, könnte ich ein Beispiel dafür, wie ich, dass auf die obige Beschreibung in meinem Controller tun würde?
UPDATE: Just zu sehen, dass Ecto 2.0.0-beta.1 out ist, und das ist supports many_to_many
, die, wie es eine Lösung für mein Problem wäre aussieht. Hat jemand ein Beispiel dafür, es in Aktion zu benutzen, wie ich es oben beschrieben habe?
Beachten Sie, dass Sie auch 'many_to_many' (anstelle von' has_many X, through: Y') verwenden müssen, um das 'put_assoc/3' richtig zu funktionieren. Sehen Sie sich den Google Groups-Link für den Eintrag an, der dies anzeigt. – Schrockwell