最近は、自分用にRailsの挙動を拡張するために書いた
lib/xxxx_ext.rbが増えてきました。
こういったファイルはconfig/initializer/の直下に
置いても良いのですが、ON/OFFを切り替えやすいので、
config/initializer/libs.rbの中から、require "xxxx_ext"
を呼ぶようにしています。

さて、今回はActiveRecordをさらに便利に使うために、
僕が行っている拡張を紹介します。

lib/active_record_ext.rb

rails>>
module ActiveRecord
class Base
def self.[](arg, *args)
case arg
when Range
find arg.to_a
when Hash
find :all, arg
when :first, :all
find arg, *args
when :last
find(:all, *args).last
when Symbol
send "find_#{arg}", *args
else
find arg, *args
end
end

def update_counters(counters)
  self.class.update_counters id, counters
end

end
end
<<--

どうでしょう、お分かりだと思いますが、ARクラスに
インデクサ (rb_aref) を定義しています。こんな感じに動作します。

pre>>

Site[1].uri
=> "http://www.google.com/"

Site[1,2].map &:uri
=> ["http://www.google.com/", "http://www.wikipedia.org/"]

Site[1..2].map &:uri
=> ["http://www.google.com/", "http://www.wikipedia.org/"]

Site[:last].title
=> "Ruby/Tk チュートリアル"

Site[:by_uri, "http://www.google.com/"].uri
=> "http://www.google.com/"
<<--

実際のアプリケーションコードの中ではあまり使っていないですが、
script/consoleの中で使うのには大変便利です。

最後に、update_countersは、インスタンスメソッドとして
欲しかったので追加しています。
Rails 2.0から仕様が変わった counter_cache については、
日比さんがこちらに記事
既存のモデル/テーブルでcounter_cacheを使う:update_counters
を書いているので参照してみてください。

posted by genki genki on Tue 15 Jan 2008 at 06:20 with 0 comments
Contents rssrss
光ファイバーを二次元振動させて走査するAR用ディスプレイ
因果の取り違え
Swift2's defer for CoffeeScript
mongodb-3.0からcreateIndexのdropDupsが無くなったらしい
mongodb-3.0以降のWiredTigerの設定を動的に変更する方法
一般楕円の高速生成アルゴリズムへの道標
farro mantecatoのレシピ
Droonga関連の記事のまとめ
RuntimeErrorの特定のメッセージに限定してrescueする方法
jQueryでscriptタグを実行せずにappendする
Tags
coffeescriptdefergroongajsmemonodenodejs
Comments rssrss
https://www.hampshireairfields.eu.com/ https://www.hampshireairfields.eu.com/: Видео для взрослых можно транслировать на надежных... 05/11 18:41
https://kra36.vip https://kra36.vip: Смысл этого текста — упростить понять логику в в... 05/11 18:03
https://www.verygoodhousehotel.com:443/bbs/board.php?bo_table=free&wr_id=773028 https://www.verygoodhousehotel.com:443/bbs/board.php?bo_table=free&wr_id=773028: As Singapore’s top-tier furniture store ɑnd expans... 05/11 17:48
https://8sites.ru https://8sites.ru: Minedrop — захватывающий слот в стиле Minecraft! ... 05/11 15:00
https://lemonkasyno-apk.it.com/ https://lemonkasyno-apk.it.com/: Thank you for any other informative site. The plac... 05/11 12:58
http://noithathoaphat.in/ctv/index.php/2026/05/01/vbet-pour-iphone-telechargez-lappli-maintenant/ http://noithathoaphat.in/ctv/index.php/2026/05/01/vbet-pour-iphone-telechargez-lappli-maintenant/: Sujet bien traité, j'adore. 05/11 11:31
https://master-vodoved.ru/karta-sajjta?pg=4 https://master-vodoved.ru/karta-sajjta?pg=4: Дополнительные компоненты: фильтры, шаровые краны,... 05/11 09:14
https://Kraken-Link2025.com/ https://Kraken-Link2025.com/: Задача этой версии — дать возможность избежать т... 05/11 09:04