先日Rails2.3.3がリリースされました。変更箇所を確認してみたかったので、下記のブログを翻訳(意訳)してみました。
Riding Rails: Rails 2.3.3: Touching, faster JSON, bug fixes
以下翻訳(意訳)メモ。間違ってるところがあったら教えてください><
Active Record
touch
touchというメソッドを追加。これはオブジェクトに変更があったときに、他のオブジェクトをtouchするメソッド。例えばコメントオブジェクトがsaveやdestroyされた時に、コメントの親のオブジェクトであるparentのreplies_changed_atカラムを更新したいような時に使う。
この機能はfragment cacheを使う際のkeyを実装するのを簡単にする。
このパターンは下記のようにラップされる。
belongs_to :parent, :touch => :replies_changed_at
子が変更されたときに、parent.replies_changed_atはtouchされる。
belongs_to :parent, :touch => true
なら デフォルトで:touch => :udpated_atになる。
fragment cacheについて
上のほうでtouchでfragment cacheが簡単に実装できる!って書いたのですが、元の文章では具体的にどうやるのか書いてなかったので調べました。多分こんな感じで、cacheのkeyに更新時刻を組み込むのだと思います。
<% cache(:key => ["all_comments", @parent.replies_changed_at].join) do %> <%= render :partial => "shared/comment", :collection => @comments %> <% end %>
commentが変更される→parentのreplies_changed_atが更新される→cacheが更新されるという流れ。
(追記)Railscastsでtouchメソッドをfragment cacheで使う例が紹介されてました。
Railscasts - Touch and Cache
belongs_toに:primary_keyオプションを追加
レガシーなスキーマ対応のためにbelongs_toに:primary_keyオプションを追加した。
belongs_to :employee, :primary_key => 'SSN', :foreign_key => 'EMPID'
JSON
バックエンドでのデコードライブラリ
バックエンドでのデコードで、jsonとyajlライブラリを使えるようにした。これらはデフォルトのYAMLバックエンドと比べてかなり速い。使いたければjson gemをインストールしてから下記のようにする。
ActiveSupport::JSON.backend = 'JSONGem'
to_jsonとas_json
JSONライブラリが実装しているto_jsonメソッドは従来のto_jsonと互換性がなく(!!!)、安全にオーバーライドすることは難しい。一般的なカスタマイズはこんな感じだろう。
def to_json(*encoder_specific_args) { :some => "json representation" }.to_json(*encoder_specific_args) end
これをDRYにして、下記のようにより自然に書けるようにした。
def as_json(options = {}) { :some => "json representation" } end
ユーザが使うメソッドなような、内部で使うメソッドのような、中途半端な現在のto_jsonをやめて、Rails3ではユーザが使うメソッドと内部で使うメソッドを明示的に分ける。今のところto_jsonをas_jsonに変更する準備をしている。
その他
- asset tagヘルパーに:concatオプションを追加。
- ActiveRecord::Base#to_xmlの後方互換性を復活させた
- Markdown helperをBlueClothからMarkdownに移した。ユーザがBlueClothを使ってmarkdown機能を提供するには、互換性を復活させるために1.0.1か2.0.5にアップグレードするべき。
concatオプションはどんな働きをするのか
例えば
<%= stylesheet_link_tag :all, :concat => true %>
有名なバグフィックス
- development modeの時に、ストリーミングのレスポンスでクラスを再読み込みするエラーを直した
- gemをunpackingしたりinstallする時などのgemまわりのバグを直した
- text_area_tagの内容をデフォルトでescapeするようにした
- filter_parametersが配列の時に正しい挙動をするようにした
- スレッドセーフ時のpostgresの文字列引用時のバグを直した
- response bodyが大きい時のパフォーマンスを改善した
(追記)flashのバグについて
翻訳とは関係ないですが・・・
Rails2.3からflashの仕様が変わってる - おもしろWEBサービス開発日記
ひょっとして直ってるかなと思って2.3.3でも試してみましたが2.3.2と同じ挙動でした。