Ktouth Brand. on Web

け〜くんこと K.Ktouth のだらだらした日常と突発的に作るプログラムや読み物とかの雑多サイト



[2009年09月12日]

ActiveRecord::Base には .each がない

2009年09月13日 07:07更新 筆者:K.Ktouth

「新着情報の最新の10件、または24時間以内に登録されたもの」

べたに SQL を書けばいいんですが、Rails っぽく、Ruby っぽく書けないかと思っています。

rails開発者向けのMLで最近こんなやりとりがありました。で、find2回でどちらかの結果を取る(「または」の部分はruby側で判断)という形が一番スマートだ、みたいな結論に落ち着きました。

で、そこで気づいたんですが。
ActiveRecord::BaseのDBアクセスはEnumerableじゃないんですねぎょ ちょっとビックリしました。
最近 Sequel ばかり使っているので Rails の定石を忘れつつある……(ぉ

ソース検証してませんが、Sequel なら多分、こう書くかなぁ。

@models = []
Model.order(:created_at.desc).each do |r|
 break unless (@models.size < 10) or (r.created_at > 1.day.ago)
 @models.push r
end

SQL発行は1回で済みますが、若干長いかなぁ?(笑) どちらが早いかは不明。データ構造が複雑で量も多いなら、こちらの方が有利かも。
SQLでLIMIT句が使えるのは一部DBに限られるから、それ以外のDBでは(内部で読み込みする際にイテレータを中断する形で)エミュレートしているはずで、ならそれを自前でやれば良いだけじゃないかーというお話。

本日のリンク元
その他のリンク元
検索