【发布时间】: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(&:attributes)。 -
你是对的。
attributes返回此{"id"=>nil, "?column?"=>"English"}。困惑我的事实是,通常对象在选择正常(不是json)属性时看起来像这样的事实:#<User:0x007f38200f3598 id: nil, name: "John">。但是,显然 json 选择的数据不能那样工作。 -
#to_s的定义方式仅输出 known 列。来自select的自定义 列不知道在表内,因此它们不会在#to_s中打印出来,而是mapped regardless。
标签: ruby-on-rails json postgresql activerecord jsonb