PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Rails ActiveRecord:Verwendung von Bind-Variablen mit doppelten Anführungszeichen auf jsonb

Sie können Parameterplatzhalter nicht in Zeichenfolgen in Anführungszeichen setzen.

Die Tatsache, dass Rails Ihnen dies erlaubt und einen String mit einfachen Anführungszeichen innerhalb des Strings mit einfachen Anführungszeichen ersetzt, zeigt an, dass Rails (wie üblich) die Regeln von SQL nicht verstanden hat.

Sie können jedoch einen Parameterplatzhalter mit anderen Zeichenfolgen in einen Ausdruck einfügen. Ich bin kein normaler PostgreSQL-Benutzer, aber ich gehe davon aus, dass Sie Zeichenfolgen zu einem vollständigen JSON-Literal verketten können:

Blog.where("upload_data @> '[ { \"name\": \"' || ? || '\"}]'", name)

Möglicherweise wird Ihr Code klarer, wenn Sie den gesamten JSON-Wert parametrisieren. Verwenden Sie %Q() um zu vermeiden, dass die wörtlichen doppelten Anführungszeichen umgekehrt werden müssen.

Blog.where("upload_data @> ?", %Q([ { "name": "#{name}" } ]))

Oder um sicherzustellen, dass gültiges JSON generiert wird, würde ich den Ausdruck in Ruby-Syntax einfügen und dann in JSON konvertieren:

Blog.where("upload_data @> ?", JSON.generate( [{name: name}] ))