15th
Tue
ActiveRecordをさらに便利にする方法の紹介
最近は、自分用にRailsの挙動を拡張するために書いた
lib/xxxx_e
が増えてきました。
こういったファイルはconfig/ini
の直下に
置いても良いのですが、ON/OFFを切り替えやすいので、
config/ini
の中から、require "xxxx_ext"
を呼ぶようにしています。
さて、今回はActiveReco
lib/active
1 module ActiveRecord 2 class Base 3 def self.[](arg, *args) 4 case arg 5 when Range 6 find arg.to_a 7 when Hash 8 find :all, arg 9 when :first, :all 10 find arg, *args 11 when :last 12 find(:all, *args).last 13 when Symbol 14 send "find_#{arg}", *args 15 else 16 find arg, *args 17 end 18 end 19 20 def update_cou nters(counters) 21 self.class.update_cou nters id, counters 22 end 23 end 24 end
どうでしょう、お分かりだと思いますが、ARクラスに インデクサ (rb_aref) を定義しています。こんな感じに動作します。
1 >> Site[1].uri 2 => "http://www.google.co m/" 3 >> Site[1,2].map &:uri 4 => ["http://www .google.co m/", "http://www .wikipedia .org/"] 5 >> Site[1..2].map &:uri 6 => ["http://www .google.co m/", "http://www .wikipedia .org/"] 7 >> Site[:last].title 8 => "Ruby/Tk チュートリアル" 9 >> Site[:by_uri, "http://www .google.co m/"].uri 10 => "http://www .google.co m/"
実際のアプリケーションコードの中ではあまり使っていないですが、
script/con
の中で使うのには大変便利です。
最後に、update_cou
は、インスタンスメソッドとして
欲しかったので追加しています。
Rails 2.0から仕様が変わった counter_ca
については、
日比さんがこちらに記事
「既存のモデル/テーブルでcounter_ca
posted by
genki
on Tue 15 Jan 2008
at 06:38