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

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

今週のEdge Rails

Riding Rails: This Week in Edge Rails

上記の記事を意訳したのでメモ。

トランザクションをネスト

  • トランザクションをネストできるように。
  • ネストする時は:require_newオプションが必要。オプション指定がないと親のトランザクションの一部と見なされる。
  • 内部ではsavepointsとかいうのを使ってるらしい
  • このトランザクションはテスト中のfixtureで使われてる?らしい
User.transaction do
    User.create(:username => 'Admin')
    User.transaction(:requires_new => true) do
      User.create(:username => 'Regular')
      raise ActiveRecord::Rollback
    end
  end
User.find(:all)  # => Returns only Admin

MemacheStoreのエンハンス

MemCacheStore使用時のパフォーマンスを改善

callbackを仕様通りに直した

ActiveRecordのドキュメントに「ActiveRecordbefore_*系のcallbackがfalseを返したら、その後の全てのcallbackとそれに紐づいたアクションはキャンセルされる。」と書いてあるけど現行バージョンではそれは動作しなくなっている。もしbefore_updateやbefore_createをキャンセルしても、after_saveは動いてしまう。2.3ではドキュメント通りになっている。

TimeWithZoneで小数秒

  • TimeクラスやTimeWithZoneクラスはxmlschemaメソッドを持つ。
  • xmlschemaメソッドXMLフレンドリーな文字列で時間を返すメソッド
  • 下記のように、xmlschemaメソッド引数で指定した値まで小数点以下を表示するようにした。
Time.zone.now.xmlschema(6) #=> "2009-01-18T14:12:56.935478Z"

jsonのキーを仕様通りに

  • json.orgには、キー値は文字列じゃないとダメと書いてある
  • そしてダブルクォートでくくれと書いてある。
  • なのでその通りにした。

2.2だとこう

{1=>2}.to_json #=> "{1: 2}"

edgeだとこう

{1 => 2}.to_json #=> "{\"1\": 2}"

テストのリファクタリング

テストをいろいろリファクタリングしたらしい

Object#tryを変更

Object#tryはこんなメソッド

def try(method)
  send method if respond_to? method
end

そんなObject#tryのふるまいをちょっと変えた

  • プライベートメソッドではNoMethodErrorに
  • オブジェクトがnilなら常にnilを返す