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 } を含むものがヒットします。

上記のシンボルを使った書き方は、プレースホルダで一般的に使えます。? マーク自体を使いたい場合だけに関わらず、色々と用途があります。

参考記事

nandovieira.com

Powered by はてなブログ