我有一个Ecto模式,其embeds_many定义如下:
schema "rounds" do
embeds_many :growth_cycles, SomeModule.GrowthCycle, on_replace: :delete
end
这将转换为PostgreSQL中的jsonb字段。默认值为空数组-[]。我想编写一个Ecto查询,该查询仅返回具有growth_cycles = [](growth_cycles未设置/为空)的回合。
我尝试过的最简单的方法是:
from(r in Round, where: r.growth_cycles == [])
但这会产生以下错误:
** (Postgrex.Error) ERROR 42P18 (indeterminate_datatype) cannot determine type of empty array
...
hint: Explicitly cast to the desired type, for example ARRAY[]::integer[].
我也尝试过:
from(r in Round, where: length(r.growth_cycles) == 0)
但这会给出一个错误,指出长度不是有效的查询表达式。
我看到了使用片段将其下拉到原始PostgreSQL的参考,但是我不确定如何做到这一点。
答案 0 :(得分:1)
您可以尝试使用fragment/1将原始SQL插入查询中。
在这种情况下,类似
(from r in Round, where: fragment("? = '{}'", r.growth_cycles)) |> Repo.all
应该工作
从文档中:
不可能使用Ecto的查询语法表示所有可能的数据库查询。需要时,可以使用片段将任何表达式发送到数据库: