gpt4 book ai didi

arrays - 如何在 Ecto 中做 'where model.field contains array'?

转载 作者:行者123 更新时间:2023-12-03 21:29:07 25 4
gpt4 key购买 nike

假设我有一个带有字段的模型 sizes那是一个数组(例如 sizes: ['S', 'M', 'L'] )。我想要完成的是构建 API,让用户能够根据大小过滤这些模型。所以一个 GET对该路径的请求:
.../products?sizes=['S','M']
应该返回给定数组是其 sizes 的子数组的所有产品 field 。所以我不想也不需要完全匹配,但我希望用户能够按照上面的解释进行过滤。我将如何在我的 Phoenix API 中实现这一点?

我只能完成过滤包含特定值( where: this in that )的那些,但是如果我传入一个数组并且我想检查该数组是否包含在该模型字段中,我有点迷茫。

在此先感谢您的帮助,如果您需要任何其他信息,请告诉我。

编辑

我正在尝试使用 fragment("? @> ?::varchar[]", p.sizes, ^params["sizes'] )它可以工作,但是如果我添加任何简单的过滤器,例如 [color: "red"],它就会失败。在现有过滤器之上,这意味着我无法创建一组过滤器,然后将其添加到 where条款如 ... and ^filters

filters = Ecto.Changeset.cast(%Product{}, params, [], [:color])
|> Map.fetch!(:changes)
|> Map.to_list

# Do I need to actually do this check like this ? (It fails otherwise)
sizes = if is_nil(params["sizes"]) do [] else params["sizes"] end

products_query = from(
p in Product,
where: fragment("? @> ?::varchar[]", p.sizes, ^sizes) and
^filters
)

这目前不起作用。

最佳答案

正如您已经发现的那样,您需要使用 @>fragment对于“数组包含数组”操作。对于你的第二个问题,链接 where带有 and 的表达式,你可以再添加一个 where :

products_query = from(
p in Product,
where: fragment("? @> ?::varchar[]", p.sizes, ^sizes),
where: ^filters
)

关于arrays - 如何在 Ecto 中做 'where model.field contains array'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41253549/

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