ActiveRecord on Rails 3 でクエリを動的に組み立てる (Lazy Loading)

Lazy Loading

これで良いのかどうか、、まだ冗長に思えるのでもっと良い他の道があるのかも。

    query = Entry.recent
    query = query.ranged params if params[:year]
    @entries = query.paginate :page=>params[:page] || 1, :per_page=>Entry.per_page

query interface や scope の戻り値は ActiveRecrod::Relation または ActiveRecord::NamedScope のインスタンスなので chain 出来る。
詳しくは http://asciicasts.com/episodes/202-active-record-queries-in-rails-3


query = query が冗長だ。

  @entries = (Entry.query do
    recent
    ranged(params) if params[:year]
  end).paginate ..

とかありそうな気がする。
若しくは条件付きチェインやコードブロックを上手く使うとか。

fetch

.to_sqlデバッグに便利。

発火させるには .first, .last, .all 辺り。

.each でも発火する。

Entry.recent.each {|e| puts e.title }

レコードが1件に特定出来ていることを保証するメソッドが欲しかったが発見出来なかった。
検査のための one? はある。

時間予算を試算する

予算感を知るのは大事だ。
個人的には積み上げて振り返る方が好きなので予算段階から諦めたり絞ったりはしない。

>http://fukui.livedoor.biz/archives/2920275.html>|
人が1年間に使える時間は4,000時間だ。 仕事をしている人であれば、2,000時間は失われる。家庭や生活に最低1,000時間費やすことだろう。残された時間は1,000時間。モノになるぐら い学習できるのは1年間に1テーマぐらいだろう。

<<

お酒飲まなければ 3h/day 捻出出来る。
休日は 8h くらい集中した時間が持てる。土日+祝日で119days、有給入れて1/3と思って良い。

  • 平日: 3h * (2/3 * 365) :730h
  • 休日: 8h * (1/3 * 365) :973h

機会損失(というと言葉が悪いが、リフレッシュや勉強会参加、買い物、テーマ以外の勉強)を 1/3 に設定すると 1700*2/3 で確かに 1000-1200h 程度か。
平日 3h をキープし、かつ機会損失を 1/4 まで切り詰めると 1500h まで伸びる。1,000h の人に比べ 1.5 倍の速さで進む事が出来る。

更に方法を変えるだけでも違うだろう。
通勤時間を短縮したり途中の使い方を変えたり、仕事を見直すという手もある。
誰かが、仕事は自分の 2/3 の時間を捧げるものであり、自分本来の仕事 - 天職と出来るようすべからく努力すべきと言っていた記憶がある。

感覚知的に、喰って行けるようになるレベルに達するまで 3-4,000 時間、熟練と言えるには 10,000 時間を要する。

社会生活が維持出来るレベルできりつめて 1,500h/year、サボると 1,000h/year、
結果が出るには最低でも 2.5 - 3 年、遅ければ 10 年を要する。
仕事と被せた場合はブースト出来るし、他にもブーストする方法は幾らでもある。

rails 3 で作ってみよう - /entries で表示

結局 logware を作る事に。
作りつつ公開しているので物好きな方は fork me on github

  • will_paginate
  • entry 単体表示
  • slug 実装
  • entry 詳細情報整備
  • 本文に何らかのフォーマット導入
  • 投稿機能

積み残し

  • factory_girl からの db:fixtures:load (そもそも用途が違うという話かも)
  • AR scope の conditional chain

AR の conditional chain (がねーよという話)

AR on Rails3 の scope & chain はとてもステキなのだけど、scope で抽象化して chain やってると直ぐに条件付き連鎖が書きたくなる。

こんな感じ

Song.list.recently.send( cond ? 'played' : 'callee' ).page….(以後、延々と続く)

調べてもわからん。ぐぐってもわからん("conditional chain" "active record" で0件)。

可能性としては

  1. 条件付き chain 自体が用意されていない、他の方法を取るのがスタンダード
  2. 自分が知らないだけ
  3. rails way な別のやり方がある

のどれか、か。

メソッドと条件式のリストを作って inject しようと思ったものの読みづらくなる&その仕組み自体をメソッドに出来そうなので自分が知らないだけか、、等々悶々としておりまつ、、

rails3 - gem 管理

ぼちぼち、のんびり作ってみる。

  • Bundler 0.8 -> 0.9 で :only 廃止、:group になった
  • generator は ./script/rails generate にお引っ越し

まとめ

参照元

英語力を付けるために無理矢理 blogger.com で英語を使ってみる。

貧困世界という事業分野

Amazing Gadgets for the Poor、面白い。

貧困世界(豊かさに手が届かない人々)をターゲットにした活動やプロダクトにはユニークで面白い発明がいっぱいある。
この記事に上がっている諸々も楽しい。Kiva の記述にある has facilitated more than $124 million in small loans なんてとんでもない成果だと思う。

解決すべきテーマ、つまり事業とイノベーションの種がそれだけ多くあるという事なのかも。

"技術で世界を変える"、そんな煽りは大好きだけど"世界"の定義は何か、時々考えてみるのも良いと思う。