結論
公式ドキュメントにある演算子を用いましょう。
ドキュメントの読み方
上記ドキュメントの読み方についてです。
例えば 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
で検索するときだけではなく、一般的に使えます。