2015-06-03 7 views
14

Ich arbeite mit Rails 4.2 und Postgres 9.4, um den neuen JSONB-Datentyp auszuprobieren. Eine der JSONB-Spalten in meiner Datenbank enthält ein Array, und ich möchte in der Lage sein, nach Datensätzen zu suchen, in denen dieses Array einen bestimmten Wert enthält. Ich finde heraus, wie dies zu tun, um die neue JSONB „Fragezeichen“ („enthält“) Operator, wie hier dokumentiert: http://www.postgresql.org/docs/9.4/static/functions-json.htmlWie kann man entkommen? (Fragezeichen) Operator zum Abfragen von Postgresql JSONB-Typ in Rails

So in roher SQL kann ich dies wie in diesem Beispiel zu arbeiten:

SELECT * FROM people WHERE roles ? '32486d83-4a38-42ba-afdb-f77ca40ea1fc'; 

Aber ich kann keine Möglichkeit sehen, diese Abfrage aus Rails über ActiveRecord zu tun. Ich habe versucht, eine rohe Abfrage tun das „wo“ -Methode wie folgt verwendet:

Person.where("roles ? ?", "32486d83-4a38-42ba-afdb-f77ca40ea1fc") 

Aber da das Fragezeichen ein Sonderzeichen verwendet Parameter zu ersetzen, erhalte ich diese Fehlermeldung:

ActiveRecord::PreparedStatementInvalid: wrong number of bind variables (1 for 2) in: roles ? ?

Ich denke, ich brauche einen Weg, um dem "?" Charakter, da ich es wörtlich passieren möchte. Ich habe es versucht \? und ?? ohne Glück. Jede Hilfe wird geschätzt!

+0

versuchen, diese ' Person.where ("Rollen? (?)", "32486d83-4a38-42ba-afdb-f77ca40ea1fc") ' –

+0

oder' Person.where ("Rollen?: Name", Name: "32486d83-4a38-42ba-afdb- f77ca40ea1fc ")' –

+0

Funktioniert es für Sie ??? –

Antwort

19

Sie sollten dies wie unten nennen:

Person.where("roles ? :name", name: "32486d83-4a38-42ba-afdb-f77ca40ea1fc") 
4

Eine Abhilfe. Führen Sie diese Abfrage, um herauszufinden, welche Funktion Ihre Betreiber Karten:

SELECT 
    oprname, 
    oprcode || '(' || format_type(oprleft, NULL::integer) || ', ' 
       || format_type(oprright, NULL::integer) || ')' AS function 
FROM pg_operator 
WHERE oprname = '?'; 

Es ergibt

oprname function 
?  jsonb_exists(jsonb, text) 
?  exist(hstore, text) 

nun die Funktion anstelle des Operators in Ihrer Abfrage verwenden:

Person.where("jsonb_exists(roles, ?)", "32486d83-4a38-42ba-afdb-f77ca40ea1fc") 
Verwandte Themen