環境
Ruby 2.5.0
Rails 5.2.0
業務的なコードを書いていると、どう工夫しても複雑なSQLに行き着く時はある。
そもそもunionを使うくらいならば
・orで代替できないか
・分割でSQLを発行した方が可読性やパフォーマンスが上がらないか
等々を検討すべきだが、そうはいってもunionを使う場面というのはあると思う。
ということでunionの実装だが、いざunionを実装しようと思ってもネット上ではarel_tableを使ったり複雑めな実装で可読性が低いものが多かった。
(arel_tableは可読性が著しく下がる場合が多いので個人的には使いたくない)
そこで紹介するのがactive_record_unionというgem。
使い方はいたってシンプル。
Gemfileにgemを追加して
1 |
gem 'active_record_union' |
例えば以下のコードを書けば
1 |
Book.where(kind: 1).union(Book.where(kind: 2) |
以下のSQLが発行される。
1 2 3 4 5 |
SELECT "books".* FROM ( SELECT "books".* FROM "books" WHERE "books"."kind" = 1 UNION SELECT "books".* FROM "books" WHERE "books"."kind" = 2 ) "books" |
とても簡単に書けますね。