JSONB哈希的Rails范围和值数组

时间:2018-12-05 22:25:16

标签: ruby-on-rails postgresql jsonb

我正在使用JSONB列,其中数据存储为{键=> [值,值,值]} 我该如何编写一个范围来返回包含特定键数组中的特定值的记录?

我已经找到了如何搜索简单的JSON哈希;

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

...但是此查询类型仍然使我无法逃脱。我所查找的所有内容都将其放置在原始SQL命令中,并且我正在寻找如何编写整洁的Rails Scopes。

1 个答案:

答案 0 :(得分:1)

使用@>运算符:

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是数组中的值之一。