Ruby on Rails SQLでサブクエリを使う

エンジニアの山本です。 Oracle Pro*CなどでコードにSQL文をガリガリと書き込んでいた私のようなおっ…

エンジニアの山本です。

Oracle Pro*CなどでコードにSQL文をガリガリと書き込んでいた私のようなおっさんエンジニアにとってRuby on Railsでまず引っかかるのが「どこでSQLが発行されているのかわからない。」だと思います。
特にActiveRecordを使うとかなり戸惑います。(というか現在進行形で戸惑ってます。)

そんな私が今回ハマったのが「サブクエリーをどう組み込みんでいいのかわからない。」でした。
たとえば、下記のようなテーブルがあったとします。

この条件で、種別が “動物” の星座の “期間” を検索しようとした場合、SQL文では通常このように書くと思います。
select During from Tbl_During where Constellation in (select Constellation from Tbl_Type where Type = ‘動物’);
この( )の中がサブクエリーなのですが、これをRuby on Railsで書くにはどうやったらいいんだと。

で、調べれてみたら意外とあっさりと答えが出ました。
こうやればいいようです。
Constellations = Tbl_Type.where(“Type = ?”, “動物”).select(:Constellation)
Tbl_During.where(Constellation: Constellations).select(:During)
まずサブクエリーだけ実行して、結果の配列をそのままメインクエリーの条件式に渡せるのですね。
驚きました。

こんなの常識、猫でも知ってるとお思い方も多いと思いますが、個人的にちょっとだけ感動したので備忘録を兼ねて今回書かせていただきました。