這是一個理論問題,但假定數據結構不能更改,而且這絕對是我們想要執行查詢的方式。這個問題更多的是爲了更好地理解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 –