如何逃脱? (问号)运算符查询 Rails 中的 Postgresql JSONB 类型

How to escape the ? (question mark) operator to query Postgresql JSONB type in Rails

我正在使用 Rails 4.2 和 Postgres 9.4 来试用新的 JSONB 数据类型。我的数据库中的一个 JSONB 列包含一个数组,我希望能够查询该数组包含特定值的记录。我想出了如何使用新的 JSONB "question mark" ("contains") 运算符来执行此操作,如此处所述: http://www.postgresql.org/docs/9.4/static/functions-json.html

所以在原始 SQL 中我可以让它像这个例子一样工作:

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

但我看不到任何方法可以通过 ActiveRecord 从 Rails 中执行此查询。我尝试使用 "where" 方法进行原始查询,如下所示:

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

但是由于问号是用来替换参数的特殊字符,所以我得到这个错误:

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

我想我需要一种方法来逃避“?”字符,因为我希望它从字面上通过。我试过了 \?和 ??没有运气。 感谢您的帮助!

你应该这样称呼它:

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

解决方法。 运行 此查询用于找出您的运算符映射到的函数:

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

它产生

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

现在在查询中使用函数而不是运算符:

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