aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/relation.rb
diff options
context:
space:
mode:
authorPratik Naik <pratiknaik@gmail.com>2009-12-26 15:07:00 +0530
committerPratik Naik <pratiknaik@gmail.com>2009-12-26 15:07:00 +0530
commit3c5a7dcaf55f427f3a48e206feb06410d011ca4f (patch)
tree1eed5483a1c1d2ad6e7a6d83408cf509c4e7b8c1 /activerecord/lib/active_record/relation.rb
parent9d3d60c64a9ce69b9932f5c543112199e576c2ad (diff)
downloadrails-3c5a7dcaf55f427f3a48e206feb06410d011ca4f.tar.gz
rails-3c5a7dcaf55f427f3a48e206feb06410d011ca4f.tar.bz2
rails-3c5a7dcaf55f427f3a48e206feb06410d011ca4f.zip
Cache the loaded relations
Diffstat (limited to 'activerecord/lib/active_record/relation.rb')
-rw-r--r--activerecord/lib/active_record/relation.rb75
1 files changed, 43 insertions, 32 deletions
diff --git a/activerecord/lib/active_record/relation.rb b/activerecord/lib/active_record/relation.rb
index c02acba786..a030ba29fa 100644
--- a/activerecord/lib/active_record/relation.rb
+++ b/activerecord/lib/active_record/relation.rb
@@ -9,6 +9,7 @@ module ActiveRecord
@readonly = readonly
@associations_to_preload = preload
@eager_load_associations = eager_load
+ @loaded = false
end
def preload(*associations)
@@ -23,38 +24,6 @@ module ActiveRecord
create_new_relation(@relation, true)
end
- def to_a
- records = if @eager_load_associations.any?
- catch :invalid_query do
- return @klass.send(:find_with_associations, {
- :select => @relation.send(:select_clauses).join(', '),
- :joins => @relation.joins(relation),
- :group => @relation.send(:group_clauses).join(', '),
- :order => @relation.send(:order_clauses).join(', '),
- :conditions => @relation.send(:where_clauses).join("\n\tAND "),
- :limit => @relation.taken,
- :offset => @relation.skipped
- },
- ActiveRecord::Associations::ClassMethods::JoinDependency.new(@klass, @eager_load_associations, nil))
- end
- []
- else
- @klass.find_by_sql(@relation.to_sql)
- end
-
- @associations_to_preload.each {|associations| @klass.send(:preload_associations, records, associations) }
- records.each { |record| record.readonly! } if @readonly
-
- records
- end
-
- alias all to_a
-
- def first
- @relation = @relation.take(1)
- to_a.first
- end
-
def select(selects)
create_new_relation(@relation.project(selects))
end
@@ -109,6 +78,48 @@ module ActiveRecord
@relation.respond_to?(method) || Array.method_defined?(method) || super
end
+ def to_a
+ return @records if loaded?
+
+ @records = if @eager_load_associations.any?
+ catch :invalid_query do
+ return @klass.send(:find_with_associations, {
+ :select => @relation.send(:select_clauses).join(', '),
+ :joins => @relation.joins(relation),
+ :group => @relation.send(:group_clauses).join(', '),
+ :order => @relation.send(:order_clauses).join(', '),
+ :conditions => @relation.send(:where_clauses).join("\n\tAND "),
+ :limit => @relation.taken,
+ :offset => @relation.skipped
+ },
+ ActiveRecord::Associations::ClassMethods::JoinDependency.new(@klass, @eager_load_associations, nil))
+ end
+ []
+ else
+ @klass.find_by_sql(@relation.to_sql)
+ end
+
+ @associations_to_preload.each {|associations| @klass.send(:preload_associations, @records, associations) }
+ @records.each { |record| record.readonly! } if @readonly
+
+ @loaded = true
+ @records
+ end
+
+ alias all to_a
+
+ def first
+ if loaded?
+ @records.first
+ else
+ @first ||= limit(1).to_a[0]
+ end
+ end
+
+ def loaded?
+ @loaded
+ end
+
private
def method_missing(method, *args, &block)