仕事で、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)と同じ実行結果。ステキ、素敵。