【问题标题】:Finding empty Postgres jsob sub array using rails使用rails查找空的Postgres json子数组
【发布时间】:2018-08-12 11:38:38
【问题描述】:

我的模型上有一个 jsonb 列,其中包含(除其他外)一组分数。我想查找分数数组为空的所有记录。数据如下所示:

Model.new(results: {scores: [], other: [], info: {things: 'stuff'}})

不幸的是,尝试查询 [] 会转换为搜索 NULL

Model.where("results -> 'scores' = ?", []).to_sql
#=> "SELECT \"model\".* FROM \"model\" WHERE NOT (results -> 'scores' = NULL)"

我该怎么做?

【问题讨论】:

    标签: ruby-on-rails postgresql ruby-on-rails-5 rails-activerecord jsonb


    【解决方案1】:

    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]')"
    

    【讨论】:

      猜你喜欢
      • 2016-06-05
      • 2016-03-09
      • 1970-01-01
      • 1970-01-01
      • 2017-04-03
      • 2018-04-13
      • 1970-01-01
      • 2014-05-05
      相关资源
      最近更新 更多