January 10, 2009 -January 16, 2009
24 commits for edge Rails this week (with one patch ported over to the 2.2 branch as well). If you want a pre-release look at Rails 2.3, this is a fine time to install a copy of edge, if you’re not already there. It’s plenty stable enough for test sites, though there are a few rough patches yet.
Nested Transactions in Active Record
Several people contributed to a big patch that gives us nested transactions in Active Record, a much-requested feature. Now you can write code like this:
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
Nested transactions let you rollback an inner transaction without affecting the state of the outer transaction. If you want a transaction to be nested, you must explicitly add the
:requires_new option; otherwise, a nested transaction simply becomes part of the parent transaction (as it does currently on Rails 2.2). Under the covers, nested transactions are using savepoints, so they’re supported even on databases that don’t have true nested transactions. There is also a bit of magic going on to make these transactions play well with transactional fixtures during testing. commit
Nahum Wild contributed some work that (inspired by his spandex_mem_cache_store plugin) that enhances the performance of Rails when using
MemCacheStore. The basic idea is to keep a per-request local cache of requests sent to
MemCacheStore, cutting down on unnecessary reads and leading to better site performance. commit
Making Active Record Callbacks behave
You may recall the spot in the Active Record documentation that says “If a
before_* callback returns false, all the later callbacks and the associated action are cancelled.” What you may not know is that this is actually broken in the current version of Rails: if you cancel a
before_create callback, the
after_save callbacks still run. In Rails 2.3, this will behave the way that the documentation says it does. commit
Fractional seconds for TimeWithZone
TimeWithZone classes include an
xmlschema method to return the time in an XML-friendly string. As of this week,
TimeWithZone supports the same argument for specifying the number of digits in the fractional second part of the returned string that
>> Time.zone.now.xmlschema(6) => "2009-01-16T13:00:06.13653Z"
JSON Key Quoting
If you look up the spec on the “json.org” site, you’ll discover that all keys in a JSON structure must be strings, and they must be quoted with double quotes. As of this week, Rails does the right thing here, even with numeric keys. commit
Josh Peek spent some time refactoring various tests inside of Action Pack, including those for query string parsing, JSON parameter parsing, XML parameter parsing, multipart parameter parsing, and URL-encoded parameter parsing. While you won’t see any new functionality as a result of this work, it’s worth shining a spotlight on the often-thankless cleanup that keeps the Rails code in good shape.