さて問題
ActiveRecordでこんなクエリ( where
句)を作るにはどうしたら良いでしょうか?
where A and (B or C or D) and (E or F)
答え
Model.where(A)
.merge(Model.where(B).or(Model.where(C)).or(Model.where(D)))
.merge(Model.where(E).or(Model.where(F)))
merge()
を使うと、 or()
の部分をグルーピングすることができます。
SQLの条件組み立ては and
で条件を絞り込んでいくのが基本ですから、 or
の部分はまとめて and
でつないでいきましょう。
or()
はどこでグルーピングがどこに入るのか予測不可能なことが多いですが、merge()
と併用するとグルーピングを明示的に制御できるようになります。
答えの2行目、閉じカッコ一つ少ない気がします。