ActiveSupportのconstantizeが便利

仕事で、Railsプログラムを書いていたとき、

実行するメソッドは同じなんだけど、クラス名だけが違う。例えば、モデルDetailとモデルItemに対してfindメソッドを実行したい。実行するモデルを動的に決めれたら楽なんだけどなぁ。

っていう場面に遭遇して、あれこれ探してみたら、ActiveSupport::Inflectorにconstantizeというメソッドがあることを知りました。

使い方は、簡単。例えば、モデルとしてItemってものを定義していたとき、"Item".constantize.find(1)ってやると、

ruby-1.9.2-p290 :013 > "Item".constantize.find(1)
  Item Load (0.4ms)  SELECT "items".* FROM "items" WHERE "items"."id" = ? LIMIT 1  [["id", 1]]
 => #<Item id: 1, item_date: "2012-02-12", income: 0, expenditure: 600, created_at: "2012-02-12 08:22:55", updated_at: "2012-02-12 09:37:23"> 
ruby-1.9.2-p290 :014 > 

と出力してくれます。これは、Item.find(1)と同じ実行結果。ステキ、素敵。