【问题标题】:How to select only part of json, stored in Postgres, with ActiveRecord如何使用 ActiveRecord 仅选择存储在 Postgres 中的部分 json
【发布时间】:2016-02-10 11:30:30
【问题描述】:

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

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

如果我这样做User.select(:settings),我将获得每个用户的所有设置。但我只想获取用户的语言。我都试过了:

User.select("settings -> 'language'")

User.select("settings ->> 'language'")

但这只是返回空对象:

[#<User:0x007f381fa92208 id: nil>,
...]

这有可能吗?如果是 - 我可以只使用json 还是需要切换到jsonb

【问题讨论】:

  • 空对象——确定吗?尝试在结果上执行.map(&amp;:attributes)
  • 你是对的。 attributes 返回此 {"id"=&gt;nil, "?column?"=&gt;"English"}。困惑我的事实是,通常对象在选择正常(不是json)属性时看起来像这样的事实:#&lt;User:0x007f38200f3598 id: nil, name: "John"&gt;。但是,显然 json 选择的数据不能那样工作。
  • #to_s 的定义方式仅输出 known 列。来自select自定义 列不知道在表内,因此它们不会在#to_s 中打印出来,而是mapped regardless

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


【解决方案1】:

试试User.select("settings -&gt; 'language' as user_language")。 结果关系中的每个对象都应响应user_language

【讨论】:

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