基于jsonb列查询Rails活动记录

时间:2019-04-04 07:16:11

标签: ruby-on-rails json

我有一个名为 User 的记录,其中有一个名为 attrs 的列。

attrs 是jsonb列。记录如下所示:

我正在发布as_json个用户的记录。

{
  "id"=>uuid1,
  "profile_id"=>uuid2,
  "campaign_id"=>uuid3,
  "asset_id"=>uuid4,
  "brand_id"=>"5",
  "region"=>"Non-EU",
  "attrs"=>{
    uuid5=>{
      "label"=>"Email",
      "value"=>"example@test.com.tw"
    },
    uuid6=>{
      "label"=>"Last Name ",
      "value"=>"Yang"
    }
  }
}

我要查询基于

User有效记录

"label"=>"Email","value"=>"example@test.com.tw"

我该怎么做?

2 个答案:

答案 0 :(得分:0)

尝试

User.where("settings @> ?", {uuid5: {label: 'Email', value: 'example@test.com.tw'}}.to_json)

更多参考,请参阅。

https://nandovieira.com/using-postgresql-and-jsonb-with-ruby-on-rails

答案 1 :(得分:0)

感谢a_horse_with_no_name回答,这里是原始sql版本:

select u.*
from users u
where exists (select *
              from jsonb_each(u.attrs) as t(uid,entry)
              where t.entry ->> 'label' = 'Email'
                and t.entry ->> 'value' = 'example@test.com.tw')

这是AR版本:

User.find_by_sql(["
  select u.*
  from users u
  where exists (select *
                from jsonb_each(u.attrs) as t(uid,entry)
                where t.entry ->> 'label' = ?
                  and t.entry ->> 'value' = ?)
  ", 'Email', 'example@test.com.tw'])

您可以将其移至模型范围或方法。或单独查询对象。

它依赖于postgresql jsonb_each方法。我只是注意到您没有指定数据库

参考https://stackoverflow.com/a/55512200/4950680