In einer meiner Phoenix-App-Tabellen habe ich ein Feld, das ein Array von Strings ist. Ich möchte in der Lage sein, einen where: like()
Abfragetyp zu verwenden, um zu sehen, ob irgendwelche der Werte in dem Array eine Abfragezeichenfolge enthalten - jedoch bin ich nicht sicher, wie das zu tun ist. In einer früheren Iteration der App, war das betreffende Feld nur ein String-Feld, und die folgende Abfrage funktionierte perfekt:Phoenix/Ecto - Abfrage nach Übereinstimmungen im String-Array
results = from(u in User,
where: like(u.fulltext, ^("%#{search_string}%"))
|> Repo.all()
Jetzt, wo ich das fulltext
Feld in ein Array von Strings geändert habe (character varying(255)[]
, in Postgres Begriffe), diese Abfrage fehlschlägt verständlicherweise mit dem Fehler
ERROR 42883 (undefined_function): operator does not exist: character varying[] ~~ unknown
aber ich bin nicht sicher, wie ich die Abfrage verfeinern könnte das neue Schema entsprechen.
Zum Beispiel eines fulltext
Feld des Benutzers wird wie folgt aussehen
["john smith", "[email protected]"]
und die dazugehörige Datensatz zurückgegeben werden soll, wenn search_string
"john"
oder "@test"
oder "n smith"
ist usw. - wenn die search_string
einen Teil entweder der Spiele Listenwerte.
In einfachem Englisch würde die Abfrage etwas wie "record records lesen, wo ein Wert wie search_string
in der Liste u.fulltext
gefunden wird".
ich von verschiedenen ‚Hacky‘ Abhilfen denken kann, wie einfach die Liste aller Benutzer zurückkehren und dann einige gekettet Enum.map
Funktionen durch sie laufen und die Werte von fulltext
für teilweise Übereinstimmungen zu überprüfen, aber wenn es eine elegantere Lösung Mit Ectos Abfragesyntax würde ich mich lieber dafür entscheiden. Kann mir irgendjemand eine Anleitung anbieten?