ActiveRecord 对 PostgreSQL 的更高级类型(范围、JSON、...)的了解和集成是不完整的,因为 AR 不理解 "results -> 'scores' = ?" SQL 字符串,AR 只看到一个(可能)包含 SQL 和单个占位符。因此,AR 不明白 [] 在替换占位符时应该转换为 JSON,它只是做了它对数组所做的事情:空数组变成 NULL,非空数组变成逗号分隔列表(例如与in (?) 构造一起使用);例如:
Model.where("results -> 'scores' = ?", []).to_sql
#=> "SELECT \"model\".* FROM \"model\" WHERE NOT (results -> 'scores' = NULL)"
Model.where("results -> 'scores' = ?", [6,11,23]).to_sql
#=> "SELECT \"model\".* FROM \"model\" WHERE NOT (results -> 'scores' = 6,11,23)"
您可以通过 #to_json 调用帮助 AR,然后依靠 PostgreSQL 的自动类型转换来解决此问题:
Model.where("results -> 'scores' = ?", [].to_json).to_sql
#=> "SELECT \"model\".* FROM \"model\" WHERE NOT (results -> 'scores' = '[]')"
Model.where("results -> 'scores' = ?", [6,11,23].to_json).to_sql
#=> "SELECT \"model\".* FROM \"model\" WHERE NOT (results -> 'scores' = '[6,11,23]')"