ActiveRecord の or は merge とセットで使え

この記事は最終更新日から1年以上が経過しています。

さて問題

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() と併用するとグルーピングを明示的に制御できるようになります。

hirohero
ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
ユーザーは見つかりませんでした