2016-05-20 6 views
0

Ich bin neu in ROR und versuche, die Suche in der PostgreSQL-Datenbank mit Active Record zu implementieren. Ich habe gefunden, dass, um Suche unabhängig von der Suche machen kann ich ILIKE Operator anstelle von equals und LIKE aber nicht sicher, was zu tun ist, wenn ich IN Operator verwenden muss.Suche ohne Berücksichtigung von Groß- und Kleinschreibung mit dem Operator IN in Ruby on Rails und PostgreSQL

Ich erhalte einen Feldnamen und eine Sammlung von Werten, die ich brauche, um zu überprüfen und Groß- und Kleinschreibung Suche funktioniert wie folgt aus:

records = records.where(filter['fieldName'] => filter['value']) 

wo filter['value'] ein Array ist.

Gibt es eine Möglichkeit, diese Zeile zu aktualisieren, um Groß- und Kleinschreibung zu vermeiden?

Wenn kein dann glaube ich, die einzige Möglichkeit, eine Schleife durch das Array ist und geteilt IN in viele OR Operationen und verwenden ILIKE für jeden einzelnen Wert in diesem Array (aber ich bin nicht sicher, wie zu verwenden oder mit Active Record) ?

Danke!

+0

Wo ist der "Filter" hash herkommt. Sieht aus wie SQLI anfällig für mich. Können Sie die in der DB bereits herabgestuften Werte speichern? Können Sie zusätzliche Indizes hinzufügen? –

+0

@ Pascalbetz Filter ist ein Teil meiner benutzerdefinierten Struktur, die ich über REST aus einer anderen App senden. Leider muss ich einen echten Fall in der Datenbank behalten, aber ich habe es fast mit den folgenden Vorschlägen behoben. –

Antwort

0

Dies ist, was für mich gearbeitet:

records = records.where('"' + filter['fieldName'] + '"' + 
         " ILIKE ANY (array[?])", filter['value'].map {|value| "%#{value}%" }) 
+0

Btw sollten Sie auch spezielle Symbole entfliehen, vorausgesetzt, dass 'value'' '' 'enthalten könnte. – ndn

0

Try this ......

records.where("lower(#{filter['fieldName']}) in ?", filter['value'].map(&:downcase)) 

Hoffnung dies für Sie arbeiten.

+0

Verwende keine Indizes ... aber sollte funktionieren. –

+0

@pascalbetz, nicht sicher, wie das funktionieren soll, da er '=' und nicht 'in' verwendet. – ndn

+0

@OlesMalkov Sie haben Recht. Sollte "IN" statt "=" sein. Oder er könnte verwenden "ähnlich" wie hier beschrieben http://stackoverflow.com/questions/4928054/postgresql-wildcard-like-for-any-of-a-list-ofwords –

2
records.where("lower(#{filter['fieldName']}) in (?)", filter['value'].map(&:downcase)) 
+0

Sieht aus wie Ihre Antwort ist am nächsten :) 'records = records.where ('' '+ filter [' fieldName '] +'" '+ "ILIKE ANY (array [?])", filtere [' value ']. map {| value | "% # {Wert}% "})" Hier ist, was für mich funktioniert hat. Vielen Dank! –

+1

@OlesMalkov sollten Sie das als Antwort posten und akzeptieren. – ndn