ほげほげほげほ

ただのメモ置き場です。基本的にプログラム関連のメモ。

Ruby on Railsでサブクエリ(副問合せ)を書く

Rubyスキルがほぼ0なのですが、Rubyでサブクエリを書く必要があったので備忘録として…

どんなクエリ書きたいの?

select * from hoge_hoge where hoge_id in (select hoge_id from hoge_hoge where type = 'Hoge' and hoge_aaa_id = 100) and type = 'Hogeee';

というクエリですね。
hoge_hogeテーブルからhoge_idを取ってきて、取ってきたhoge_idHogeeeタイプを元にhoge_hogeテーブルからデータを取得するクエリです.

説明すると結構ややこしいですね!  
2回クエリ走らせりゃええやんけ と思う方もいるかと思いますが(自分もそう)
キャッシュ使ってないシステムなのでクエリ発行回数を減らしたくて・・・
キャッシュ入れりゃええやんけ と思う方が大多数だと思いますが(自分もそう)
とりあえず、まぁそんな感じのクエリを書く必要があったできたわけです。

どうやるのか?

載ってありました. http://tokyo.supersoftware.co.jp/code/7546

つまり、こういうことらしい。

hoge_ids = HogeHoge.where(type: 'Hoge').and(hoge_aaa_id: 1200)
hoge = HogeHoge.where(hoge_id: hoge_ids).and(type: 'Hogeee')

え?ちょっと待って。これ2回クエリ走らせてない?

と、書きながら思いました。しかし、log/development.logを見てみると...

SELECT `hogehoge`.* FROM `hoge_hoge` WHERE `hogehoge`.`hoge_id` IN (SELECT `hogehoge`.`hoge_id` FROM `hoge_hoge` WHERE `hogehoge`.`type` = 'Hoge' AND `hogehoge`.`hoge_aaa_id` = 100) AND `hogehoge`.`type` = 'Hogeee';

意図したクエリになっていました。。。不思議。。。

おわりに

Ruby初心者、ActiveRecord初心者なので内部でどうなってるのか調査しないといけないですが、
なんとかできました。
これってどういう仕組なんですかね?次くらいに調べたいと思います。。。

それでは〜