aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record
diff options
context:
space:
mode:
authorJon Leighton <j@jonathanleighton.com>2011-06-30 00:19:16 +0100
committerJon Leighton <j@jonathanleighton.com>2011-06-30 00:20:54 +0100
commite9fa602e1c70a5c8e1644b218d5784e7c195eb35 (patch)
treee2d91ccddbce3ee3d6fada444a1d2c76a05074be /activerecord/lib/active_record
parent9378d7e2139b1f3aa58a0f8aae648983c3a148bb (diff)
downloadrails-e9fa602e1c70a5c8e1644b218d5784e7c195eb35.tar.gz
rails-e9fa602e1c70a5c8e1644b218d5784e7c195eb35.tar.bz2
rails-e9fa602e1c70a5c8e1644b218d5784e7c195eb35.zip
Define to_ary on ActiveRecord::Base to return nil. Improve performance of Array#flatten under 1.9, see comment for details.
Diffstat (limited to 'activerecord/lib/active_record')
-rw-r--r--activerecord/lib/active_record/base.rb12
1 files changed, 12 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb
index fd52038647..5a62a29ddb 100644
--- a/activerecord/lib/active_record/base.rb
+++ b/activerecord/lib/active_record/base.rb
@@ -1900,6 +1900,18 @@ MSG
private
+ # Under Ruby 1.9, Array#flatten will call #to_ary (recursively) on each of the elements
+ # of the array, and then rescues from the possible NoMethodError. If those elements are
+ # ActiveRecord::Base's, then this triggers the various method_missing's that we have,
+ # which significantly impacts upon performance.
+ #
+ # So we can avoid the method_missing hit by explicitly defining #to_ary as nil here.
+ #
+ # See also http://tenderlovemaking.com/2011/06/28/til-its-ok-to-return-nil-from-to_ary/
+ def to_ary # :nodoc:
+ nil
+ end
+
def set_serialized_attributes
sattrs = self.class.serialized_attributes