【发布时间】:2017-06-28 01:55:23
【问题描述】:
从这个查询开始,作为 Ecto 版本的基础:
select folder_id, json_agg(p.*)
from folder_memberships inner join profiles p
on p.id=folder_memberships.profile_id
where folder_id in (1234) group by folder_id;
我有这个代码:
# ids=[1234]
from(p in Profile,
join: link in FolderMembership, on: link.profile_id == p.id,
select: [link.folder_id, fragment("json_agg(?) as members", p)],
group_by: link.folder_id,
where: link.folder_id in ^ids
)
|> Repo.all
这让我得到以下错误:
== Compilation error on file lib/profile.ex ==
** (Ecto.Query.CompileError) variable `p` is not a valid query expression.
Variables need to be explicitly interpolated in queries with ^
(ecto) expanding macro: Ecto.Query.select/3
我确定我错过了小学,但如果我知道它是什么,我会发疯的。我尝试了许多选项,但我看到的所有示例都类似于fragment("json_agg(?)", p.some_field),而不是p 本身。
【问题讨论】:
-
我认为
fragment("json_agg(?)", p.*)会起作用,但它会转义*并最终将名为“*”的列的值发送到json_agg。我查看了 Ecto 中包含fragment的所有测试,但没有发现任何通过表名或table.*...我认为现在碎片不可能实现。 -
是的,尝试了同样的结果。好的,很高兴知道它不只是我。 :) 如果您有任何想法,还将感谢您对实现相同结果的替代方法的回答!