aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/reflection.rb
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2013-06-12 16:58:22 -0700
committerAaron Patterson <aaron.patterson@gmail.com>2013-06-12 16:58:22 -0700
commit9d79333140f290eba7c91c48302469e5f73e604d (patch)
treeba659ba12a0896e7e22cc263b3322c49d8fce6b1 /activerecord/lib/active_record/reflection.rb
parent0ee351b428e038394d495c20a868d40ad3032e83 (diff)
downloadrails-9d79333140f290eba7c91c48302469e5f73e604d.tar.gz
rails-9d79333140f290eba7c91c48302469e5f73e604d.tar.bz2
rails-9d79333140f290eba7c91c48302469e5f73e604d.zip
split aggregates from association reflections to avoid is_a checks later
Diffstat (limited to 'activerecord/lib/active_record/reflection.rb')
-rw-r--r--activerecord/lib/active_record/reflection.rb16
1 files changed, 11 insertions, 5 deletions
diff --git a/activerecord/lib/active_record/reflection.rb b/activerecord/lib/active_record/reflection.rb
index 5ea103f6e9..1e021765ae 100644
--- a/activerecord/lib/active_record/reflection.rb
+++ b/activerecord/lib/active_record/reflection.rb
@@ -5,7 +5,9 @@ module ActiveRecord
included do
class_attribute :reflections
+ class_attribute :aggregate_reflections
self.reflections = {}
+ self.aggregate_reflections = {}
end
# \Reflection enables to interrogate Active Record classes and objects
@@ -27,13 +29,18 @@ module ActiveRecord
reflection = klass.new(macro, name, scope, options, active_record)
- self.reflections = self.reflections.merge(name => reflection)
+ if klass == AggregateReflection
+ self.aggregate_reflections = self.aggregate_reflections.merge(name => reflection)
+ else
+ self.reflections = self.reflections.merge(name => reflection)
+ end
+
reflection
end
# Returns an array of AggregateReflection objects for all the aggregations in the class.
def reflect_on_all_aggregations
- reflections.values.grep(AggregateReflection)
+ aggregate_reflections.values
end
# Returns the AggregateReflection object for the named +aggregation+ (use the symbol).
@@ -41,8 +48,7 @@ module ActiveRecord
# Account.reflect_on_aggregation(:balance) # => the balance AggregateReflection
#
def reflect_on_aggregation(aggregation)
- reflection = reflections[aggregation]
- reflection if reflection.is_a?(AggregateReflection)
+ aggregate_reflections[aggregation]
end
# Returns an array of AssociationReflection objects for all the
@@ -56,7 +62,7 @@ module ActiveRecord
# Account.reflect_on_all_associations(:has_many) # returns an array of all has_many associations
#
def reflect_on_all_associations(macro = nil)
- association_reflections = reflections.values.grep(AssociationReflection)
+ association_reflections = reflections.values
macro ? association_reflections.select { |reflection| reflection.macro == macro } : association_reflections
end