Ruby on rails 如何逃离危险?(问号)运算符查询Rails中的Postgresql JSONB类型

Ruby on rails 如何逃离危险?(问号)运算符查询Rails中的Postgresql JSONB类型,ruby-on-rails,postgresql,activerecord,jsonb,Ruby On Rails,Postgresql,Activerecord,Jsonb,我正在使用Rails4.2和Postgres9.4来尝试新的JSONB数据类型。数据库中的一个JSONB列包含一个数组,我希望能够查询该数组包含特定值的记录。我使用新的JSONB问号contains运算符解决了这一问题,如下所述: 因此,在原始SQL中,我可以让它像本例中那样工作: SELECT * FROM people WHERE roles ? '32486d83-4a38-42ba-afdb-f77ca40ea1fc'; 但我看不到任何方法可以通过ActiveRecord在Rails

我正在使用Rails4.2和Postgres9.4来尝试新的JSONB数据类型。数据库中的一个JSONB列包含一个数组,我希望能够查询该数组包含特定值的记录。我使用新的JSONB问号contains运算符解决了这一问题,如下所述:

因此,在原始SQL中,我可以让它像本例中那样工作:

SELECT * FROM people WHERE roles ? '32486d83-4a38-42ba-afdb-f77ca40ea1fc';
但我看不到任何方法可以通过ActiveRecord在Rails内部执行此查询。我尝试使用where方法执行原始查询,如下所示:

Person.where("roles ? ?", "32486d83-4a38-42ba-afdb-f77ca40ea1fc")
但由于问号是用于替换参数的特殊字符,因此我得到以下错误:

ActiveRecord::PreparedStatementInvalid:绑定变量的数量错误 1对2:角色

我想我需要一个办法逃出这个世界?角色,因为我想让它通过字面意思。我试过\?和没有运气。
感谢您的帮助

您应该这样称呼它:

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

变通办法。运行此查询以了解操作员映射到的函数:

选择 姓名, oprcode | | | |格式typeoprleft,NULL::integer | |',' ||格式_typeopright,NULL::integer | | AS函数 来自pg_操作员 其中oprname='?'; 它产生

oprname函数 ? jsonb_existsjsonb,文本 ? 出口商店,文本 现在在查询中使用函数而不是运算符:

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

试试这个人。角色在哪里,32486d83-4a38-42ba-afdb-F77CA40EA1COR人员。角色在哪里?:名称,名称:32486d83-4a38-42ba-afdb-f77ca40ea1fc@R_O_R您知道可以使用sql查看查询生成的内容,而无需实际运行查询。@muistooshort I checked Person.whereroles?:名称,名称:32486d83-4a38-42ba-afdb-f77ca40ea1fc是正确的方法。。。我使用to_sql进行了测试。。但无法回答,因为它标记为dup,带有错误的语言答案。@R\u O\u R-我测试了你的第二个答案,它确实有效!非常感谢。我希望我能接受你的回答,如果有人没有把我的问题错记为重复的话。很高兴知道。谢谢如果需要所有JSONB运算符的列表,可以查询WHERE-oprcode::text,如“JSONB%”;