gpt4 book ai didi

postgresql - 在 Ecto embeds_many 关联中查询

转载 作者:行者123 更新时间:2023-11-29 12:54:23 24 4
gpt4 key购买 nike

尝试使用 Ecto embeds_many 进行试验,效果很好,直到我需要查询嵌入字段中的一些数据。

所以我有一个类似 product 的东西 embeds_many categories

schema "products" do
field :code, :string, null: false

embeds_many :categories, Category,
on_replace: :delete,
primary_key: {:id, :binary_id, autogenerate: false}
do
field :name, :string
end
end

def create_changeset(%Product{} = product, attrs) do
product
|> cast(attrs, [:code])
|> cast_embed(:categories, with: &attributes_changeset/2)
end

def attributes_changeset(%{} = product_attribute, attrs) do
product_attribute
|> cast(attrs, [:id, :name])
end

创建产品后,我最终在 postgres 表中得到类似这样的内容

id 代码类别

1    11     {"{\"id\": \"dress\", \"name\": \"Dress\"},
"{\"id\": \"shirt\", \"name\": \"Shirt\"}}
2 22 {"{\"id\": \"dress\", \"name\": \"Dress\"}}

所以现在我想查询所有 products where id == "dress",当然我想得到上面的 2 个结果。

我试过这样的东西:q = from p in Product, where: fragment("? @> ?", p.categories, '{"id": "dress"}') 但将数组转换为整数:运算符不存在:jsonb[] @> integer[] ... WHERE (p0."categories"@> ARRAY[123,34,105,100,34,58,32,34,100,114,101,115,115,34,125])

或者说:q = 来自产品中的 p,其中:fragment("? @> ?", p.categories, "[{\"id\":\"dress\"}]"),获取 格式错误的数组文字:“[{“id”:“dress”}]”

我希望是这样的:q = from p in Product, where: fragment("? -> 'id' = ?", p.categories, "rochie") 但完全不确定这是否有效。

最佳答案

categoriesjsonb[]在这里,不是普通的 json , 运算符(operator) @>不会直接使用它。您可以使用 ANY<@做你想做的事:

where: fragment("? <@ ANY(?)", ~s|{"id": "dress"}|, p.categories)

这将运行 '{"id": "dress"}' <@ ?对于类别数组中的每个类别,如果其中任何一个匹配则返回 true。

( ~s|"a"| 只是一种更简洁的写法 "\"a\"" 。)

关于postgresql - 在 Ecto embeds_many 关联中查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46889476/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com