読者です 読者をやめる 読者になる 読者になる

おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

Rails2.3.3での変更点

先日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 %>

とすると、public/stylesheets配下のcssが全部結合されてall.cssになる。

BlueClothとMarkdownってなに?

テキストファイルをHTMlに変換するライブラリらしい。
BlueCloth
Markdownっていう名前のライブラリは見つけられず・・・

有名なバグフィックス

  • 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と同じ挙動でした。