結論
公式ドキュメントにある演算子を用いましょう。
ドキュメントの読み方
例えば 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 }
を含むものがヒットします。
上記のシンボルを使った書き方は、プレースホルダで一般的に使えます。?
マーク自体を使いたい場合だけに関わらず、色々と用途があります。