Запрос активной записи рельсов на основе столбца jsonb - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть запись с именем Пользователь , в которой есть столбец с именем 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 голосов
/ 04 апреля 2019

Благодаря 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.Я просто заметил, что вы не указали свою базу данных

Ref https://stackoverflow.com/a/55512200/4950680

0 голосов
/ 04 апреля 2019

Попробуйте,

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

Подробнее см.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...