【问题标题】:Querying rails active record based on jsonb column基于jsonb列查询rails活动记录
【发布时间】:2019-04-04 07:16:11
【问题描述】:

我有一个名为 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".

我该怎么做?

【问题讨论】:

  • 如果attrs 列中有一个数组而不是键值对会更容易

标签: ruby-on-rails json


【解决方案1】:

试试,

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

更多参考见..

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

【讨论】:

  • 哈希uuid5uuid6等中有uniq键。所以我认为你的方法行不通
【解决方案2】:

感谢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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多