USO800

Web開発者oakbowのブログです

フィリピン留学を一ヶ月やってみて。

f:id:oakbow:20150525004927j:plain

フィリピン留学に来てはや一ヶ月が経ちました。
経ってみるとあっという間なのですが、ここで一度振り返ってみたいと思います。

 

留学一ヶ月で英語話せるようになった?

何を持って話せるようになったか、という定義が必要ではあるんですが、日常会話レベルと規定してみると、ぶっちゃけしゃべれるようにはまったくなっていません。
個人的にある程度期待していたレベルに達していないので、正直少々不安ではあります。
今の学校には三ヶ月申し込んでいるんですが、この調子で残り二ヶ月後、それなりのレベルになっているのかなあ…と。

一ヶ月でどの程度のレベルになっているかは個人差がかなり大きいと思うので、とりあえず私の留学前の英語力を客観視してみましょう。

 

留学前の英語力

TOEIC のスコアは 475点(2014年6月頃)です。
この TOEIC を受ける直前に、DMM 英会話(いわゆるスカイプ英会話)を一ヶ月間、30クラス(1クラス25分)受講しています。比率は忘れましたがリスニングが弱く、それをリーディングで多少補っているスコアでした。
高校時代の英語の成績は比較的良好で、そこそこ難関と言われる大学に合格しています。
センター試験だけでなく二次試験でも英語のテストがあった…と思います。
高校生の頃、一年ほど近所の英会話教室に通った経験があります。
まあ、大学受験ははるか23年前なのですが、受験英語の経験は結構大きいなと感じています。このあたりについてはそのうち改めて記事にしたいですね。

 

社会人になってから特別英語を使う機会はなく、その辺りは人並み。
ただし開発者になってから(だいたい10年前くらい)は英語のドキュメントを読む機会が増え、特に Rails でコードを書くようになった2年ほど前からはほぼ毎日何かしら英文を読む毎日です。
このあたりは多分、一般の社会人とは違うところですね。
とはいえ Rails プログラマとしては一般的な英語力なんじゃないかな?と思います。
読んでるドキュメントは heroku のヘルプや github の README やイシュー他、stack overflow の質疑応答全般という感じ。
辞書ひかなくても開発系のドキュメントであればだいたい読めますが、たまにニュアンスが良く読み取れないので誤読していないか良く不安になる、というレベルです。

 

で、留学一ヶ月経っての気づき

認識していた私の弱点は、TOEIC スコアの示す通りリスニングが弱い、という点です。
その分文法は若干強いので、リーディングで多少巻き返しています。
これはどうやら日本人の一般的傾向のようですが、私はこの傾向がやや強めなようです。
で、このリスニング力が一ヶ月で変わったかというと、まったく実感がないレベル。
もしかしたらほんのちょっとだけ変わっているかな?という気がしないでもないですが、単に先生に慣れて意思の疎通がちょっと容易になっただけのような気もします。
無数にあるフィリピン留学のブログなどでは一ヶ月くらいでリスニング力が急激に上がるような話をちょくちょく見かけたので、正直結構期待していたのですが…。

 

とはいえまったく成長していない訳ではないです。
英会話やる上でとても重要といわれる語彙力は少しずつ向上しているのを感じますし、発音や文法も良くなっているように思います。
リスニングに弱点を抱える割になぜか私はスピーキングがそこそこ良いらしいのですが、こちらも当初のブロックイングリッシュから、多少なりとも文法を意識して話せるようになったと思います。
授業で習ったばかりの単語やイディオムをできるだけ交えてしゃべってみたりとか。
入学時点の私の総合評価は Begginer-3 でした。
すぐ上が Intermidiate-1 なのでビギナーとしては上の方って感じかな?
一ヶ月経過後、Debate と Presentation のクラスで Intermidiate の認定を受けているので、実感だけじゃなく実際にそういうことなんだろうと思います。
ただ、リスニングできないと会話が成り立たないのでここなんとかしたいんだよなあ。。
普通は聞き取れるようになるのが先で、言いたいことを伝えられないもどかしさを感じるって流れになるらしいんですけどね。

 

ところでどのくらい勉強しているの?

授業が一日8コマあります。1コマは50分で休憩は10分。朝の8時が一限目の開始で、午前中に4コマ。
昼休みはちょっと長めで、五限目の開始は13時半から。
基本的に毎日その日の復習をやり、出されていれば宿題をやります。
土日は完全フリーですが、基本的に一日はほぼ遊び、一日はほぼ勉強しています。
土曜日の午前中は任意参加の単語テスト(1000単語または1500単語)があるのでできるだけ受けています。
土日にやる勉強も平日の延長線上ですが、時間的な余裕があるので間に合っていない復習をやったり、単語テストの復習をしたり、一部の授業の予習をしたりしています。
ほんとうはここで持ち込んだ英語のテキストをこなしていきたいのですが、なかなか余裕がありません。
私以上に勉強している人もいるのでもっと頑張んなきゃ、と思いはするものの、あんまり根詰めても効率あがらなさそうなので、週末のうち一日はしっかり遊ぶと決めています。
せっかくの海外、せっかくの南国なんだし。

 

まとめ、そして期間に関しての考察

まったくまとまらないのですが、フィリピン留学を一ヶ月やってみての今の状況をできるだけ客観的に書いてみました。
この記事の内容が後に続くフィリピン留学生の役に立てば、と思います。
特に留学期間で悩んでいる方については参考になるかもしれない、と思っています。

結局留学前の英語力や、それまでどれだけ英語を勉強していたか、英語に触れていたかでもかなり違うと思うのですが、その辺ざっくり一般化して考えてみますと、正直短期留学はもったいないな、とやはり思います。

一週間の留学の方、結構います。正直英語力の観点では何の効果もないと思います。
社会人としてはなかなかそれだけの時間を融通するのも大変ですが、現実は非常です。
英語の勉強の発奮材料にするためにはいいとは思いますが、かかるお金が…。

二週間の留学の方も結構います。現実的に日本企業で働いている場合、二週間の留学はかなり無理をしてなんとか融通できるかどうかのレベルだと思います。融通できたらかなり恵まれている方ですよね。でも悲しいかな、英語力の観点からはあまり芳しい効果はないような気がしています。
ただ一週間の留学の時よりさらに英語の学習の意識や習慣を作ることが出来るというメリットはあります。
一週や二週の方はGWに集中し、ほとんどが社会人の傾向が強いようです。

三週間って方は見かけず、次は四週間(一ヶ月)という方がそこそこいらっしゃいます。
こちらは自営業を除けば会社を辞めて来た方が圧倒的ですね。
四週間で英語の勉強は終了って訳ではなく、その後オーストラリアやニュージーランド、カナダなどにワーキングホリデーに行く方が多い印象があります。
むしろワーキングホリデーのために一ヶ月程度英語の勉強をやっているのかもしれません。
ただ、私の現時点の成果を鑑みるに、ワーキングホリデーやるにしてももう少し長期間留学した方が良いような気がしています。
というのも、ワーキングホリデーって就業先によってはあまり英語の勉強にはならないらしいんですよね。
英語力が低い場合はやっぱり英会話能力があまり問われない就業先しか選択肢がなかったりするらしく。
ワーキングホリデーを念頭に留学を考えている方は、その辺りもふまえてよく考えた方が良いように思います。
とはいえ四週間ともなると成果が出る人はそこそこいそうな気がしているのですが、ぶっちゃけ留学以前にどれだけ英語力があったかと、どれだけ事前に勉強してきたかにかかっていると思います。留学の四週間でがんばるの前提で。

 

ただ、ここの期間の考察は当たり前ですが私見によるものです。
特に私の場合、元々三ヶ月(〜六ヶ月)のつもりで来ているので、一ヶ月以内の留学生とは根本的に時間に関する考え方が違いそうです。
二週の方の場合、オプション扱いの9限目や土日授業を受けてる方も結構います。
短期集中、土日返上でやってみた場合はまた違った感想を持つかもしれません。

 

さいごに

現実は非常だと言う話をさせていただきました。
私の留学先は100%日本人なので授業以外は必ずしも英語漬けではないのですが、とはいえ厳しい現実です。
日本人が少ない、生徒同士の会話も英語にならざるを得ない学校もあるものの、今の我が身をそこに置いてもそれほど変わっているようには思えないんですよね。
一ヶ月こんだけ英語の勉強してんだから、もうちょっとくらい日常会話できそうな片鱗が感じられても良さそうなもんなのになあ。
また二ヶ月経過時点で振り返りをやってみたいと思います。
リスニング力上がってるといいなあ…(切実

愚痴っぽくなっちゃいましたがサンミゲル三本消費したのでこの辺で。

 

トライシカンに乗ってみました。

f:id:oakbow:20150511231404j:plain

フィリピンにはトライシカンという乗り物があります。
全土でメジャーな乗り物かどうか分からないのですが、当地マクタン島では良く利用されています。
主にメインストリートからはずれた道路へ移動するための交通手段、という感じ。
写真の通り、自転車の右側にサイドカーをつけた感じです。
定員は基本的に2名、たまに3名のものも。
ライトや変速機、ブレーキはついてません。ペダルもまともについていないこともあります。

このトライシカンに乗ってみました。
乗ったと言ってもサイドカー側じゃなくて自転車側の方です。

学校からジプニーなどに乗ることが出来るメインストリートまでは若干距離があるので、出かける場合はたいていトライシカンを使います。
ほとんどの先生もトライシカンで出退勤してます。
近距離移動ではなくてはならない市民の足なんです。
で、かねてから私、このトライシカンに興味がありまして。。

とある週末にトライシカンを使ったんですが、ふと思いたって、自転車こいでる少年に聞いてみました。
「ねね、俺とちょっと変わってくんない?」
change以外はまともかどうか非常に怪しい英語でしたが、身振りも手伝ってあっさり通じ、少年はすんなり交代してくれました。
トライシカン初運転です!

サイドカー側に乗ってるだけだとさっぱり分からんのですが、これ、結構難しいです。
ブレーキ無し、変速無しってのは意外と大した問題じゃないんですが、まっすぐ進まないんですよ。
多分自転車単体だったら無意識かつ小刻みに車体を傾けて乗っているんだと思うんですが、それが一切出来ないので一度右に寄り出したらひたすら右に、左に寄りだしたらひたすら左に、引き寄せられるように進んじゃうんですね。
これをハンドルで制御するのがほんと大変。単に切るだけじゃ無理で、ハングオンみたいに切りたい方向に体持ってかないと方向変えられないんですよ。
一度はどうしても変えられなくて、右側の原っぱにそのまんま突っ込みましたからね。幸い電柱にぶちあたって止まりましたけど。
このときはさすがにちょっとヤベッて思いましたけど、トライシカンは結構頑丈なんで特に壊れたりはしませんでした。
いったん降りて道路に戻しながら恐る恐る少年の様子を伺いましたが、別に怒ってる風でもなかったのでそのまま続けて漕ぐことにします。
どうやら調子に乗って漕ぎまくってスピード上げてしまうと、右や左に慣性が働いてしまった場合に制御するのが難しくなるようです。
物理的に痛い目を見たので、ここからはおとなしく漕ぎつつちょいちょい、とハンドルを切って手遅れになる前の制御を心がけます。

しかしまあ今まで見た限りでは少年たちはいちいちハングオンなんかやらずにまっすぐ走らせていたので、ここはもう経験値の差かな、と思います。
おそらくそこまで左右に曲がる力が働く前に修正するので訳なくまっすぐ進んでるように見えるんでしょうけれど、やるとなるとほんと難しいです。
まあそれが面白くてたまらなくて、学校からメインストリートまでのほとんどを漕がせてもらいましたけどね。
途中何台かのトライシカンとすれ違ったんですが、向こうの少年らが
「なんでお前お客さんに乗せてもらってんのww」
って口々に叫んでました。全部ビサヤ語かタガログ語なんでビタ一文分からないんですが、まあ、こういう時に何言っているのかは何となく分かるもんです。
そう言ってたに決まってます。

目的地のメインストリートまでは歩けば20分、トライシカンなら5分くらいです。
この件の一部始終を先生に話したんですが、
「それで料金はどうしたの?」
「ちゃんと普通に払ったよ」
って言ったら爆笑してました。

 

こんな感じでフィリピン生活楽しんでます。
そのうちまたリベンジしたいと思います。

語学学校、どこにする?

f:id:oakbow:20150503123454j:plain

フィリピン留学を考えた場合、どの学校にするか?ってのはかなり悩みどころです。
選択肢がとてもいっぱいあるので。
ありすぎるのでだいたいこの辺で絞り込みを行う人が多いと思います。

  • 日本人経営か韓国人経営か
  • 学校の所在地はどこか(マニラかセブかクラークかなど)
  • マンツーマンが多いか

私は悩んだ末、 ファーストイングリッシュグローバルカレッジ という学校にしました。

日本人経営、セブ周辺、マンツーマンが多い(増やしたりも出来る)あたりを重視しています。
ほんとはさらにネット環境についても可能な限り調べてみたんですが、もともとフィリピンのインフラそのものが脆弱なので、どの学校も日本に比べればイマイチな環境、という程度しかなかなか分からず。。
その中でも比較的良い方なのかな?と期待して選んでもいます。

まあ実際のところやはり思った以上に回線の問題はネックになる訳ですが。。
他を知らないので比較の話は出来ませんが、他校の体験談などを読む限りは同程度かちょっとマシなのかな?という感じです。

さて、先に上げたみっつのポイントについて、ちょっと考えてみたいと思います。 

日本人経営か韓国人経営か

フィリピンの語学学校は基本的に、日本人か韓国人が作っています。なので、どちらの国の人が作ったかによって大まかに二分されるんですね。
韓国人経営だと

  • ご飯が基本的に韓国料理。あまりおいしくない
  • スタッフに日本人がいないか、いてもごくわずか
  • 生徒は韓国系が多い

という感じみたいです。あくまで私が調べた範囲では、ですが。
こちらの語学留学は基本的に全寮制で食事付きなので、学校の雰囲気に大きく影響するこの点は結構大きいんですね。
日本人ほど味にこだわらない国民性なのか、韓国料理と言ってもそれほどおいしくないので、韓国料理が好きだから平気という訳でもないらしく。和食が出る学校もあるけれど、やはり和食とはどことなく異なるようです。

日々困りごとや学校について分からないことって結構あるものの、日本人スタッフがいないと英語で聞かざるを得ず、十分な情報やサポートを得られなかったり。
外国人ばかりに囲まれると英語必須になってしまい日本語が恋しくなってしまう、などなど。
ただし英語必須の点に関しては、むしろ英語を話さざるを得ない環境に自分を追い込むため、敢えて選ぶ人も多いようです。
あとは、韓国人経営の学校の方が比較的安めなのかな?寮の充実度やカリキュラムにも依るので一概には言えませんけどね。

 

学校の所在地はどこか

学校がどこにあるかも結構重要です。
都市部であれば生活の利便性が高いものの、遊びにいきやすいので勉強に集中しづらいという面もあるようです。
だいたいは語学学校が固まっている地域というものがあり、マニラ、セブ、クラーク、バギオなどから選ぶことが出来ます。
一番学校が多いのがセブで、次がマニラかな?

私の場合、マニラは治安があまり良くないという話を聞いていたのと、学校の数の多さでほぼ最初からセブに決めていました。
ただし、セブの学校は青い空と海の写真をふんだんに使い、リゾート地での快適な語学留学をアピールしますが、ほとんどのセブの学校はリゾート地から離れているので、実態とは開きがあるようです。
というのも、プライベートビーチ持っているようなリゾートホテルはセブにはなく、マクタン島に集中しているから。小一時間程度で来れる距離なので、土日にちょっと足を伸ばす程度で南国の海を楽しむことは出来ますけどね。

 

マンツーマンが多いか

あるいはTOEICやりたいとかビジネス英語習得したいとかのカリキュラム重視ですね。

初心者はよりマンツーマンの増やした方が良いとも聞くので、この点を重要視する方も結構多いみたいです。
フィリピンの語学留学は北米などのそれと比べて安いのがウリです。
人件費がかかるのでどうしても高額になりやすいマンツーマンの時間を、比較的多く取ることが出来るという点が特に大きいです。

とはいえやはりマンツーマンをこなせる先生を多数抱えるのは大変なのか、マンツーマンの授業数の多さを売りにする学校は、比較的高額な傾向があるように思いました。
基本のカリキュラムから柔軟にカスタマイズ可能で、マンツーマンの数をさらに増やしたりできるところもあります。
一方でマンツーマン重視の場合、例えば一日6コマ以上といった条件を付けると学校の数がかなり限られるので、他の条件をいったん外して探した方が良いかもしれません。

マンツーマンの授業はグループクラスより割高になるので、かなりお財布直撃な条件でもあります。
私と同じように仕事を辞めて留学を決意する方も多く、無職状態での高額な投資に不安を感じる方も多いと思います。
どこまでこの条件を重視するか、どのあたりでバランスを取ることにするかは結局本人次第でもあります。
個々の英語のレベルもバラバラですからね。

なお、カリキュラムのカスタマイズが可能な学校の場合は、週単位で変更を効かせることが多いようでした。
とりあえず入ってみてからマンツーマンの数をより増やしてみたり、なんてのも可能だったりします。
このあたりの対応は学校によると思いますので、どんどんエージェントに問い合わせてみましょう。

 

私の場合

このみっつの条件については、

  • 経営者は日本人
  • 所在地はセブ(厳密にはマクタン島)
  • マンツーマンは4クラスだけど増やせる

です。 

CEOは日本人で、ブログも毎日書いてます。どのくらいの割合か良く分かりませんが結構な割合でこちらの学校にいます。現地人並みに日焼けしていて、すれ違っても気づかないレベルですw

所在地は一応セブに分類されますが、セブ島ではなくお隣の小島のマクタン島です。リゾートホテルがうようよありますが、基本的にセブシティとかなり違っていて、はっきりいって田舎です。このあたりは善し悪しですが、身の危険を感じることがあまりなく、誘惑が少ないので勉強に集中しやすいので、日本人の語学留学には悪くない環境だと思います。
セブについての主に観光的な視点での注意事項などには一通り目を通しましたが、マクタン島では当てはまらないことも多いです。

基本のカリキュラムはマンツーマン4にグループクラス4です。グループクラスも最大6名の少人数クラスなので、話す機会は結構あります。
追加費用は必要ですが、グループクラスをマンツーマンに変えたり、9限目を追加したり、土日に授業時間を追加したりも出来ます。
私はマンツーマンを増やした方が良いかな?と考えてとりあえず最初の4週だけをマンツーマン7:グループクラス1にしました。
このあたりは正直なにが自分に合っているのか自分じゃ分からないし、エージェントもある程度傾向的なことしか話せないので、結局やってみないと分からないところで、悩ましいですね。
この記事を書いている現在は一応正しい選択だったかなと思っていますが、マンツーマン6:グループクラス2でも良かったかなとも思います。
マンツーマンだとかなりの時間しゃべっているので、一日の言語量が結構なものになってくるのでほんとへとへとになるんですよ。
今までの人生で一番勉強していたのは高校3年生の夏から冬にかけてですが、それだって先生と一対一になったりなんてまずありませんからね。
大学受験を経験した方には、あれには及ばないけれどあの感覚を思い出すことにはなるよ、と言っておきます。

さいごに

学校選びはなかなか大変で、気にし始めるときりがない感じも割とあります。
他の学校を知らないので、私自身、今の学校が他の学校に比べてどういった点で優れているのか良く分からない部分もあります。
何を重要視するかはかなり人によって違うみたいなんですが、かといってある程度の条件を付けて絞らないときりがないくらい学校があるので、留学を考えている方は参考にしてみてください。
エージェント経由で申し込みが必要な学校もあれば直接申し込み可能なところあり、と多彩ですが、気になったところはどんどん問い合わせてみると良いと思います。

 

フィリピンに、来ました。

f:id:oakbow:20150503114148j:plain

4/19(日)からフィリピンに来ました。
目的は語学留学です。
英語の勉強をここでみっちり半年ほどやる予定です。

開発者のみなさんは日々感じていると思いますが、やっぱり英語力、欲しいんですよね。
調べ物をしていると英語のドキュメントに当たる必要は毎日あるし。
読むことは読めるけどすらすらという訳にも行かず、辞書を引いてもニュアンスがはっきりしないことも多く。
github のプルリクエストやイシューのやりとりを確認してみても、非常に短い文章でのフランクなものが多くて「多分こんなことを言っているのかな?」といまいちはっきりしない、もやもやしたものを抱えたままになってしまうんですよね。

Ruby 関連だと RubyKaigi など各種カンファレンスが開かれるので外国人もいっぱい来るし。
そこまで大きくなくても、各種 Web サービスの meetup などで開発者が来日することもあるし。
他国のカンファレンスその他のスピーチが YouTube などにアップされていることもあるし。
英語が通じないのであまり出てこないのだと思うけど、実は首都圏にも外国人の開発者は結構いるようだし。
英会話が、ほんの日常会話レベルででもできればできることたくさん増えるよなあ、という思いはずっとありました。
なかなか話を聞く機会がない人が目の前にいるのに、挨拶程度の話しか出来ないってほんっともったいない!って思うことが度々あったんですよね。

最近はスカイプ英会話の Web サービスも盛り上がっていますし、昔ながらの英会話教室もたくさんあるので、日本に居ながらにして英語を習得することももちろん可能です。
しかし私は結局、フィリピン留学を選びました。
スカイプ英会話は去年実際にやってみてなかなか良かったんですが、一日一回レベルでも継続していくのは結構大変で長続きせず。。。
性格的な問題も大きいと思うのですが、英語をやるしかない環境に置かれた方が良いかな?と考えての選択です。
実は今年からフリーランスで働くことを選んだのも、語学留学するためという理由が大きいです。

すでにフィリピンでの語学留学に関する情報は探せばいろいろ見つかるんですが、私なりの視点で現地の情報をお伝えできればと思っています。
こちらでは勉強の傍ら開発を行う余裕はほぼないので、単なる日記になるかもしれませんが、お時間のある際にもぜひ読んでください。
フィリピン、とっても楽しいですよ。

 

写真は空港出てすぐの道路。
白い車はタクシーです。

Rails4のActiveRecordは、IN演算子のサブクエリを使える

f:id:oakbow:20150324011856p:plain

結論

SQLでは WHERE 句で IN 演算子というものを使えます。 この IN 演算子の中は、カンマ区切りの配列のような形で要素を列挙する形でも、別の SQL の出力結果(サブクエリ)を利用することもできます。

SELECT * FROM users WHERE id IN (1,5,7,10,50...)

SELECT * FROM users WHERE id IN (SELECT user_id FROM presences WHERE ...) 

こんな感じの二つの書式を使うことが出来ます。

Rails3 ではこのうち前者のタイプは普通に使えたんですが、後者は Squeel などの外部の力を借りないとできなかったと思います。

Rails4 ではどちらもできるようになっているよ、というお話です。

こんな感じで使えます

Student(学生)モデルとReport(レポート)モデル、Credit(単位)モデルがあるとします。

Student:Report は1対多、Student:Credit は1対1の関係にあります(話を簡単にするため、教科の概念をなくしています)。

ここで、最終レポートを提出した学生全員に単位を与える処理を考えてみましょう。

アプリケーションサイドから素直に考えた場合、こんなコードになると思います。

 student_ids = Student.joins(:reports).where('reports.type= ?', :final).pluck(:id)

 Credit.where('student_id IN ? ', student_ids).update_all(grade: 'good')

SQL はこんな感じになります。

SELECT students.id 
FROM students 
INNER JOIN reports ON students.id = reports.student_id 
WHERE reports.type = 'final'

UPDATE credits SET grade = 'good' WHERE student_id IN (1, 5, 12, 33, 156, ...)

でもこれ、こう書けるんですね。

 student_ids = Student.joins(:reports).where('reports.type= ?', :final).select(:id)

 Credit.where(student_id: student_ids).update_all(grade: 'good')

SQL はこうなります。↑と違って一回だけ発行されます。

UPDATE credits 
SET grade = 'good' 
WHERE student_id IN (
  SELECT students.id 
  FROM students 
  INNER JOIN reports ON students.id = reports.student_id 
  WHERE reports.type = 'final')

そう。 同じ書式のままで、配列でも ActiveRecord::Relation でも受け取ってくれるんです。SQL の IN 演算子と似ていて、非常に直観的ですね。これはすごい。 Rails3 で Squeel が入った状態から始めた私はいまいち素の AR にできることできないことをちゃんと把握できていないんですが、これ、Arel 使わないとできないと思ってました。。

サブクエリのすすめ

前者は SQL を二回発行して、まずレポートを提出した学生の ID 一覧を取得し、その後学生の ID 一覧に合致する単位データを一括で「良」に更新しています。 後者は SQL の発行回数は一回。レポート提出者の学生の ID の集合を取得し、その集合に合致する単位データを更新しています。

データ量が少なければ微々たる差しかありませんが、どの RDBMS でもほぼ確実に後者の方が速いです。

SQL というのは集合を扱うことに関しては非常に優れていて、集合の状態のまま条件としてうまく渡して一度で処理できると、特にデータ量が増えてきたときにものすごい差になって来るんです。 なので可能な限り後者の形で発行してあげる必要があります。 集合の扱いに関しては通常の言語が及ぶことはまずないので、配列やハッシュでいったん受け取って加工して…などということは基本的に考えない方がいいです。

サブクエリは遅いこともある。。。という話をSQL初級講座的なものを読んで避けようとする方もいると思いますが、それはサブクエリじゃない通常のクエリとの対比の話であって、ネイティブコードで実行される、集合処理に特化した命令(SQL)の代わりに、Ruby で配列処理やっても余計に遅くなるだけなので、素直にサブクエリ使いましょう。

もちろん例外はありますが、基本的には SQL の発行回数が少なければ少ないほど速いです。

実際に遭遇したコードに近いもの

今回の話はコードレビューで知りました。

本物のコードは上の例とは違って、「最終レポートを提出していない学生をすべて不可にする」という感じの処理をやっています。

同じではありませんが、こんなコードになっています。

Report モデルは、レポートの提出がないとレコードが生成されません。

 student_query =
      Student
      .joins(
        sanitize_sql_array([<<-SQL, :final])
          LEFT OUTER JOIN reports
            ON students.id = reports.student_id
              AND reports.type = ?
        SQL
      )
      .where("reports.student_id IS NULL").select(:id)

  Credit
  .where(student_id: student_query)
  .update_all(grade: 'not_good')

こんな感じ。 sanitize_sql_arrayプレースホルダのために利用しています。

結合条件を AR4 で書けると良いのですが、そこまではさすがにできないのでこんな書き方をしています。

最後に

ここに書いたコードやクラスは説明のために頭で考えたミニマムコード(例として十分な最小限のコード)です。

実際に動かしている訳ではないので不備がある可能性があります。

記事の内容やコードに間違いがありましたらご連絡ください。

可能な限り補足修正したいと思います。

はー、はじめて技術ブログみたいな記事書いたわ。