这是一个理论问题,但假定数据结构不能更改,而且这绝对是我们想要执行查询的方式。这个问题更多的是为了更好地理解where
过滤器将如何动态组合,而不是实际上想从这样的查询中获得结果。假设一个Car表的数据库,其中每辆车都有一个manufacturer_id
列,其中包含诸如“BD324”或“GM512”的ID,“BD”&“GM”被视为前缀。使用动态数量的过滤器编写Ecto查询
我们需要在汽车桌上进行查找,以便汽车在前缀匹配给定的前缀集时返回。因此,考虑前缀列表:
prefixes = ["BD", "GM", "EX", "RD", "DE"]
..we'd想返回有manufacturer_id
与所列的任何开头的所有汽车。即(如同x 或 LIKE y 或 LIKE z)。
以下药剂/外生代码将寻找一个前缀:
search_prefix = Enum.at(prefixes, 0) <> "%"
from c in Car, where: like(c.manufacturer_id, ^search_prefix)
我们将如何着手建立基于prefixes
列表中where
条款?
谢谢!向IRC发表José的讲话,这确实是一条路(至少现在)。如果你的要求是AND,而不是OR,那么你可以在acc中使用一个reduce:'Enum.reduce前缀,查询,fn前缀,acc - >,其中:like(q.manufacturer_id,^(前缀< >“%”))end' –
or_where查询是在Ecto 2.1中添加的https://github.com/elixir-ecto/ecto/commit/640e8f5f7f97eab68e4eebcd517803f71d90ebc1#commitcomment-18945603 –