Rails — Postgres — запрос столбца jsonb

У меня есть столбец jsonb с именем «доступное_количество». который будет иметь образцы значений

{ "100": 50, "1000":10 }

Теперь я хочу запросить все ключи со значениями меньше 50.

Я попробовал этот запрос,

Bundle.where('available_quantity @> ?', {'100': 5}.to_json)

Но этот дает мне весь Bundle с available_quantity, содержащим {100: 5}.

Как я могу это сделать? Это вообще возможно?


person Suganya Selvarajan    schedule 22.05.2020    source источник
comment
посмотрите здесь stackoverflow.com/questions/44531689/. Я думаю, что ваши ключи должны иметь одно имя, чтобы это работало, но несколько значений   -  person Joel Blum    schedule 22.05.2020
comment
@Joel_Blum, да, если у меня есть ключ, это легко. Но ищем способ сделать это с существующей структурой БД.   -  person Suganya Selvarajan    schedule 22.05.2020
comment
Что вы имеете в виду под с существующей структурой БД?   -  person Sebastian Palma    schedule 22.05.2020
comment
@SuganyaSelvarajan Это больше вопрос postgres, чем Rails, хотя я не вижу, что это возможно   -  person Joel Blum    schedule 22.05.2020


Ответы (1)


Вы можете использовать оператор ->>:

Bundle.where("(available_quantity->>'100')::int < 50")
person Sebastian Palma    schedule 22.05.2020
comment
@sebastian_palma, это работает. Но я хочу получить все строки с любым ключом, имеющим значение меньше 50. - person Suganya Selvarajan; 22.05.2020
comment
можно ли здесь дать несколько ключей? Bundle.where(( available_quantity-››'100, 50')::int ‹ 50) ??? - person Suganya Selvarajan; 28.05.2020
comment
Я думаю, что вы можете, но вам нужно будет добавить оператор AND или OR, available_quantity->>'100, 50' недействителен, если у вас нет того же самого ключа JSON для этого. - person Sebastian Palma; 28.05.2020
comment
хорошо, я обновил свой json, чтобы он хранился в виде массива. образец: available_quantity: [{номинал=›1000, количество=›19}, {номинал=›5000, количество=›20}] . Теперь мой запрос будет выглядеть так: Bundle.where(( available_quantity-››'quantity')::int ‹ 50) . Но он возвращает пустое отношение. - person Suganya Selvarajan; 28.05.2020
comment
Это новая и другая ошибка. Не стесняйтесь создавать новый вопрос @SuganyaSelvarajan. - person Sebastian Palma; 28.05.2020
comment
Проверка stackoverflow.com/questions/62065706/ здесь - person Suganya Selvarajan; 28.05.2020