【发布时间】:2016-03-02 19:21:32
【问题描述】:
我仍在尝试了解如何处理在 Ecto 中创建/更新 has_many, through: 关联。我已经重新阅读了José's 和the docs 的关联帖子,但我仍在苦苦挣扎。
我拥有的是这样的:
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/models/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
我有一个 JSON 端点,它接收 Dish 的参数,其中我有一个名为 dietary_prefs 的键,它作为逗号分隔的字符串传递,例如:
[info] POST /api/vendors/4/dishes
[debug] Processing by Mp.Api.DishController.create/2
Parameters: %{"dish" => %{"dietary_prefs" => "2,1"}, "vendor_id" => "4"}
(在此 SO 帖子中删除了 "dish" 的附加参数。)
如何在我的控制器中处理这个问题?具体来说,我想要这种行为:
- 对于
POST请求(创建操作),在dish_dietary_prefs中创建必要的记录,以将这个新的Dish与给定的DietaryPrefs 相关联。对于DietaryPref记录,逗号分隔的字符串是ids。 - 对于
PUT/PATCH请求(更新),创建/销毁dish_dietary_prefs中的必要记录以更新关联(用户可以将菜肴重新分配给不同的饮食偏好)。 - 对于
DELETE请求,销毁dish_dietary_prefs。我认为这个案例已经通过模型中的on_delete配置处理了。
我的控制器中已经有为给定供应商创建/更新菜肴的逻辑(这只是一个简单的has_many/belongs_to 关系),但我仍然不知道如何创建/更新/销毁这些关联给定的菜。
任何帮助将不胜感激。
如果我将"need to receive the IDs and manually build the intermediate association for each" DietaryPref 关联到Dish,我能否获得一个示例,说明如何在我的控制器中对上述规范执行此操作?
更新:刚刚看到 Ecto 2.0.0-beta.1 已经发布,那就是 supports many_to_many,这看起来可以解决我的问题问题。任何人都有使用它的例子,就像我上面描述的那样?
【问题讨论】:
标签: elixir phoenix-framework ecto