Rails вложенный запрос JSONB - PullRequest
0 голосов
/ 16 марта 2019

у меня есть активный объект записи, подобный этому

`<BlockExercise id: 1, type: nil, user_id: 1, number: "S51_1", status: "close", exercise_distribution: {"Day1"=>{"BN3"=>"", "SQ1"=>"", "date"=>"10/03/2019"}, "Day2"=>{"BN2"=>"", "date"=>""}, "Day3"=>{"DL1"=>"", "date"=>""}, "Day4"=>{"DL2"=>"", "SQ2"=>"", "date"=>""}, "Day5"=>{"BN1"=>"", "date"=>""}}, created_at: "2019-03-15 18:59:02", updated_at: "2019-03-15 18:59:02"> `

Здесь столбец exercise_distribution - это тип jsonb. Поскольку это один объект (строка), а здесь несколько ключей (дней) со значениями Uniq. Я хочу ключ (день), который имеет дату или нет. так вот ансер будет "Day1"=>{"BN3"=>"", "SQ1"=>"", "date"=>"10/03/2019"} Как я могу получить это по SQL-запросу или любым другим подходящим способом.

1 Ответ

1 голос
/ 16 марта 2019

Весь этот вопрос указывает на то, что вы используете JSONB, где вы должны использовать реляционную модель и создать таблицу, которая является анти-шаблоном .

json - это новый EAV - отличный инструмент, когда он вам нужен, но не что-то Вы должны использовать в качестве первого выбора.

Хотя вы можете выполнять запросы на основе столбца JSONB:

BlockExercise.where("(Day1->>'date' <> '') IS NOT TRUE")

То, как вы структурируете структуру данных, будет очень неуклюжим, поскольку вы должны это сделать:

BlockExercise.where("(Day1->>'date' <> '') IS NOT TRUE")
             .where("(Day2->>'date' <> '') IS NOT TRUE")
             # ...

С другой стороны, объединение записей намного проще и эффективнее.

BlockExercise.joins(:exercise_distributions)
             .where.not(date: nil)
...