【问题标题】:How to exclude parts of json, stored in Postgres, when selecting using ActiveRecord?选择使用 ActiveRecord 时,如何排除存储在 Postgres 中的部分 json?
【发布时间】:2016-05-20 18:55:00
【问题描述】:

这是对这个问题的后续问题:

How to select only part of json, stored in Postgres, with ActiveRecord

假设我有一个模型User,它有一个类型为json 的字段,称为settings。假设该字段大致如下所示:

{
  color: 'red', 
  language: 'English', 
  subitems: 
    {
      item1: true, 
      item2: 43, 
      item3: ['foo', 'bar', 'baz']
    }
}

与上面引用的问题不同的是,我想知道如何排除部分 json。所以在这里,我想从settings 中选择所有内容,除了:

subitems: 
  {
    item1: true, 
    item2: 43, 
    item3: ['foo', 'bar', 'baz']
  }

【问题讨论】:

  • 比相关问题复杂得多:] 使用两个查询的解决方案是否适合您?第一个查询获取所有顶级 json 键,第二个查询实际选择您希望排除的所有字段。
  • 嗯,实际上,我不介意手动选择所有需要的键。所以我需要类似:User.select("settings -> ['color', 'language'] AS modified_settings"),它应该返回对象,响应方法modified_settings,它应该返回{color: 'red', language: 'English'}。你知道如何一次选择多个键吗?
  • 不幸的是,我也可以找到一种同时检索多个密钥的方法。但是您始终可以使用 keys_to_fetch.map{ |k| "setting -> '#{k}' as setting_#{k}"}.join(',') 之类的内容动态构建查询
  • 好的,谢谢。我认为这是一个很好的解决方法!

标签: ruby-on-rails json postgresql activerecord


【解决方案1】:

就我而言,
>>User.select("subitem -> 'item1' AS subitem1", "subitem->'item2' AS subitem2").map(&:attributes)

使用 rails 5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 2020-11-26
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多