from(d in Dish, where: d.id == 20, preload: [:vendor, :dietary_prefs]) |> Repo.first |> Dish.changeset(%{}) |> Ecto.Changeset.put_assoc(:dietary_prefs, dietary_prefs)dietary_prefs = from(dp in Mp.DietaryPref, where: dp.id in ^[1,2]) |> Repo.alldefmodule Mp.Dish do
use Mp.Web, :model
schema "dishes" do
belongs_to :vendor, Mp.Vendor
many_to_many :dietary_prefs, Mp.DietaryPref,
join_through: Mp.DishDietaryPref, on_delete: :delete_all,
on_replace: :delete
end
# ...
def changeset(model, params \\ :invalid) do
model
|> cast(params, @required_fields ++ @optional_fields)
|> cast_assoc(:dietary_prefs)
|> cast_assoc(:vendor)
|> validate_required(@required_fields)
end
enddefmodule Mp.DietaryPref do
use Mp.Web, :model
schema "dietary_prefs" do
many_to_many :dishes, Mp.Dish,
join_through: Mp.DishDietaryPref, on_delete: :delete_all,
on_replace: :delete
end
# ...
def changeset(model, params \\ :invalid) do
model
|> cast(params, @required_fields ++ @optional_fields)
|> cast_assoc(:dishes)
|> validate_required(@required_fields)
end
end** (RuntimeError) cannot change `dietary_prefs` with a struct because another embed/association is set in parent struct, use a changeset instead
(ecto) lib/ecto/changeset/relation.ex:150: Ecto.Changeset.Relation.do_change/4
(ecto) lib/ecto/changeset/relation.ex:264: Ecto.Changeset.Relation.map_changes/7
(ecto) lib/ecto/changeset.ex:865: Ecto.Changeset.put_relation/5
def update(conn, %{"id" => id, "dish" => dish_params}, vendor) do
dish = Repo.get!(vendor_dishes(vendor), id)
dietary_prefs = dish_params["dietary_prefs"]
|> parse_dietary_pref_ids
|> get_dietary_prefs_with_ids
case (Repo.transaction(fn ->
{ :ok, updated_dish } = dish
|> Repo.preload(:dietary_prefs)
|> Ecto.Changeset.change(dish_params)
|> Ecto.Changeset.put_assoc(:dietary_prefs, [])
|> Repo.update
updated_dish
|> Ecto.Changeset.change
|> Ecto.Changeset.put_assoc(:dietary_prefs, dietary_prefs)
|> Repo.update
end)) do
{ :ok, { :ok, dish }} ->
render(conn, "show.json", dish: dish)
{ :ok, { :error, changeset }} ->
conn
|> put_status(:unprocessable_entity)
|> render(ChangesetView, "error.json", changeset: changeset)
end
endfrom(d in Dish, where: d.id == 20, preload: [:vendor, :dietary_prefs]) |> Repo.first |> Dish.changeset(%{}) |>Ecto.Changeset.put_assoc(:dietary_prefs, dietary_prefs)dietary_prefs = from(dp in Mp.DietaryPref, where: dp.id in ^[1,2]) |> Repo.all |> Enum.map(&Ecto.Changeset.change/1)To view this discussion on the web visit https://groups.google.com/d/msgid/elixir-ecto/07339e5f-8ea6-4bb6-8147-07ac6d899a88%40googlegroups.com.--
You received this message because you are subscribed to the Google Groups "elixir-ecto" group.
To unsubscribe from this group and stop receiving emails from it, send an email to elixir-ecto...@googlegroups.com.