Rails Scope для JSONB Hash с массивом значений - PullRequest
0 голосов
/ 06 декабря 2018

Я использую столбец JSONB, где данные хранятся как {ключ => [значение, значение, значение]} Как мне написать область, которая возвращает записи, которые содержат определенное значение в массиве определенного ключа?

Я выяснил, как искать простые JSON-хэши;

scope :rice_flour, -> { where("ingredients ->> 'flour' = ?", "rice") }

... но этот тип запроса все еще избегает меня.Все, что я посмотрел, изложено в простых командах SQL, и я ищу, как написать аккуратные Rails Scopes.

1 Ответ

0 голосов
/ 06 декабря 2018

Используйте оператор @>:

postgres@/> select '["a", "b"]'::jsonb @> '["a"]';
+------------+
| ?column?   |
|------------|
| True       |
+------------+

postgres@/> select '["a", "b"]'::jsonb @> '["c"]';
+------------+
| ?column?   |
|------------|
| False      |
+------------+

https://www.postgresql.org/docs/10/functions-json.html

Ваша область действия будет такой:

scope :rice_flour, -> { 
   .where("ingredients -> 'flour' @> '[\"rice\"]'::jsonb")
}

Это сгенерирует SQL как:

WHERE (ingredients -> 'flour' @> '["rice"]'::jsonb)

Предполагая, что flour является ключом, а rice является одним из значений в массиве.

...