- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我仍然在尝试如何处理在Ecto中创建/更新has_many, through:
关联。我已经重新阅读了José's关于关联以及the docs的帖子,但我仍在努力。
我所拥有的是:
网站/模型/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
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
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
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"}
"dish"
的其他参数。)
POST
请求(创建操作),请在dish_dietary_prefs
中创建必要的记录,以将此新Dish
与给定的DietaryPref
关联。逗号分隔的字符串是id
记录的DietaryPref
。 PUT/PATCH
请求(更新),请在dish_dietary_prefs
中创建/销毁必要的记录以更新关联(用户可以将菜肴重新分配给不同的饮食偏好)。 DELETE
请求,销毁dish_dietary_prefs
。我认为这种情况已经通过模型中的on_delete
配置进行了处理。 has_many/belongs_to
关系),但是我仍然不知道如何为给定菜肴创建/更新/销毁这些关联。
DietaryPref
关联到
Dish
,是否可以在我的 Controller 中获得有关如何对上述规范执行此操作的示例?
many_to_many
,这似乎可以解决我的问题。有人像我上面描述的那样有一个在实际中使用它的示例吗?
最佳答案
感谢无与伦比的绝地大师何塞·瓦利姆本人,我已经弄清楚了这一点(在Ecto 2.0.0-beta.1
中):
这是我的最终控制者:
def create(conn, %{"dish" => dish_params }, vendor) do
dietary_prefs = get_dietary_pref_changeset(dish_params["dietary_prefs"])
changeset = vendor
|> build_assoc(:dishes)
|> Repo.preload(:dietary_prefs)
|> Dish.changeset(dish_params)
|> Ecto.Changeset.put_assoc(:dietary_prefs, dietary_prefs)
case Repo.insert(changeset) do
{:ok, dish} ->
conn
|> put_status(:created)
|> render("show.json", dish: dish)
{:error, changeset} ->
conn
|> put_status(:unprocessable_entity)
|> render(ChangesetView, "error.json", changeset: changeset)
end
end
def update(conn, %{"id" => id, "dish" => dish_params}, vendor) do
dish = Repo.get!(vendor_dishes(vendor), id)
dietary_prefs = get_dietary_pref_changeset(dish_params["dietary_prefs"])
changeset = dish
|> Repo.preload(:dietary_prefs)
|> Dish.changeset(dish_params)
|> Ecto.Changeset.put_assoc(:dietary_prefs, dietary_prefs)
case Repo.update(changeset) do
{ :ok, dish } ->
render(conn, "show.json", dish: dish)
{ :error, changeset } ->
conn
|> put_status(:unprocessable_entity)
|> render(ChangesetView, "error.json", changeset: changeset)
end
end
defp vendor_dishes(vendor) do
assoc(vendor, :dishes)
end
defp parse_dietary_pref_ids(ids) do
ids
|> String.split(",")
|> Enum.map(fn(x) -> Integer.parse(x) |> Kernel.elem(0) end)
end
defp get_dietary_prefs_with_ids(ids) do
from(dp in DietaryPref, where: dp.id in ^ids) |> Repo.all
end
defp get_dietary_pref_changeset(param) do
param
|> parse_dietary_pref_ids
|> get_dietary_prefs_with_ids
|> Enum.map(&Ecto.Changeset.change/1)
end
关于elixir - has_many,通过Ecto中的关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35756250/
docs状态 run(t, name, module, function, args) :: t when function: atom, args: [any] Similar to run/3,
目前,我正在寻找在运行 mix 任务时添加 SQL 语句日志记录的方法。例如,mix ecto.rollback 和 mix ecto.migrate 等命令输出信息: ... 13:45:53.01
我有两张 table 。 topics的表其中has_many tweets .我的表tweets belongs_to topic . 主题架构: defmodule Sentiment.Topic
今天,和往常一样,我尝试制作 混合 ecto.migrate 在我的 Phoenix 应用程序中,意外地发现了以下错误: warning: could not find repositories fo
我可以使用什么函数来检查关联是否已经加载? 最好检查关联是否已加载,而不是尝试使用它并获取 Ecto.Association.NotLoaded错误。 最佳答案 您可以使用 assoc_loaded?
我在 postgresql 中有一个表,我想用一个随机数更新所有记录的“points”列的值。在其他语言中,我们可以循环遍历所有数据库记录,但我如何使用 ecto 来做到这一点?我试过这个: Rep
在处理具有关联的模型时,加载关联模型的最佳实践是什么:显式使用 Repo.preload 或指定在定义查询时应预加载的关联? 最佳答案 它们是等效的,因此任何方法都可以,真的。如果您想将所有内容都放在
有什么办法可以逆向预加载吗? %Post{ comments: [] } posts = Repo.all(Post) |> Repo.unload(:comments) %Post{ com
使用 Ecto 访问大写字段的最佳方式是什么? 我必须处理一个相当困惑的模式。有些列是大写的。 我设置了以下模型: defmodule SourcesApi.SourceStatus do use
在下面的链接中做了一些研究之后 https://github.com/elixir-lang/ecto/tree/master/examples/simple 我对如何在 elixir 中使用 ect
有没有办法通过选择另一个连接列来预加载记录? # table structure # User 1---* Post 1---* PostTag *---1 Tag # extract definit
考虑以下架构: defmodule EctoBug.Post do use Ecto.Schema import Ecto.Changeset schema "posts" do
这些都不起作用: from m in Model, where: m.name == ^~r(/.*#{query}.*/i)from m in Model, where: m.name =~ ^~r
假设我有这些模式: defmodule Sample.Post do use Ecto.Schema schema "post" do field :title has_man
我有一个针对多个数据库的应用程序,它就像一个监视应用程序的应用程序,它以一种不可能静态控制的方式(在配置文件中)生成报告、调解通知、运行任务和东西,所以我认为它可以启动一个监督多个 Repo 的主管来
我正在尝试编写单个变更集,以更新模型并插入关联。我找不到有关如何使用 put_assoc/4 的示例 order = order |> Proj.Order.changeset(%{sta
我正在寻找所有 User在其 match_history 中没有特定字符串元素的 s field 。我对此进行了猜测: matched_user = User |> where([u], ^devic
我无法成功运行 Ecto 迁移以删除最初创建时提供的唯一索引 :name属性(以便不使用默认索引名称)。但是,我现在无法删除该索引,因为似乎 Ecto 正在尝试查找名称不正确的索引(尽管我已经提供了它
为什么在 Ecto changeset方法您是否将参数设置为默认值:empty原子?例如 def changeset(user, params \\ :empty) do ... 这是否允许您使
注意:我使用的是 MySQL 5.7。 我有两个名为 Post、Comment 的表 schema "posts" do field: id, string field :titl
我是一名优秀的程序员,十分优秀!