Questa è una domanda teorica ma si presuppone che la struttura dei dati non possa cambiare e che questo sia sicuramente il modo in cui si desidera eseguire la query. Questa domanda è più per comprendere meglio lo in modo che i filtri where
siano composti dinamicamente da piuttosto che in realtà voler ottenere i risultati da una query come questa.Composizione di una query Ecto con una quantità dinamica di filtri dove
immaginare un database con una tabella di auto in cui ogni macchina ha una colonna manufacturer_id
che contiene un ID come "BD324" o "GM512", con "BD" & "GM", considerato come prefissi.
Abbiamo bisogno di fare una ricerca sul tavolo dell'auto in modo che le macchine vengano restituite quando il prefisso manufacturer_id
corrisponde a un determinato set di prefissi. Quindi, data una lista di prefissi:
prefixes = ["BD", "GM", "EX", "RD", "DE"]
..we'd vogliono tornare tutte le automobili che hanno una manufacturer_id
che inizia con qualsiasi di quelli elencati. Ad esempio (LIKE x O LIKE y O LIKE z).
il seguente codice Elixir/Ecto sarebbe cercare un prefisso:
search_prefix = Enum.at(prefixes, 0) <> "%"
from c in Car, where: like(c.manufacturer_id, ^search_prefix)
come potremmo fare per costruire la clausola where
in base alla lista prefixes
?
Grazie! Ho parlato con José su IRC e questa è davvero la strada da percorrere (almeno per ora). Se il requisito che hai è AND, piuttosto che OR, puoi usare un riduci: 'Enum.reduce prefissi, query, prefisso fn, acc -> da q in acc, dove: like (q.manufacturer_id,^(prefisso < > "%")) end' –
o_query sono state aggiunte in Ecto 2.1 https://github.com/elixir-ecto/ecto/commit/640e8f5f7f97eab68e4eebcd517803f71d90ebc1#commitcomment-18945603 –