Rails で JSONB を使う際に where で検索する

結論

公式ドキュメントにある演算子を用いましょう。

www.postgresql.org

ドキュメントの読み方

上記ドキュメントの読み方についてです。

例えば jsonb ->> text → text という記載内容は次の意味を持ちます。

  • jsonb には、検索対象となるデータが入る(= JSONB 型のカラム名)
  • ->> は、用いる演算子である
  • text → text という記述については、
    • 左側の text は、検索に用いる値の「型」が text であるということ
    • 右側の text は、検索の結果得られる値の「型」が text であるということ

具体例

具体例を書いてみます。

Foobar というモデルの hoge というカラムが JSONB 型であったとします。この hoge というカラムに納められている JSONB 型のデータの中から { "hello": "world" } という key-value を含むレコードを探すとします。

このとき、ActiveRecord では以下のように書きます(先ほどの演算式を参照)。

Foobar.where("hoge ->> 'hello' = ?", 'world')

Boolean を返す ? を使いたいとき(プレースホルダ内でクエスチョンマーク自体を使う)

公式ドキュメントに記載の ? という演算子は、検索対象の key の値の真偽を調べるための演算子です。ここで、演算子の ? がプレースホルダの ? と同じ文字なので、書き方を工夫する必要があります。

工夫と言っても大したことはなく、? を用いずに、任意に命名したシンボル をプレースホルダとします。例えば次のようになります。

Foobar.where('hoge ? :fuga', fuga: 'isHappy')

上記の書き方により、hoge カラムにある値のうち、 { isHappy: true } を含むものがヒットします。

上記のシンボルを使ったプレースホルダの書き方は JSONB で検索するときだけではなく、一般的に使えます。

参考記事

nandovieira.com

Powered by はてなブログ