aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/relation.rb
diff options
context:
space:
mode:
authorPratik Naik <pratiknaik@gmail.com>2010-01-03 03:27:14 +0530
committerPratik Naik <pratiknaik@gmail.com>2010-01-03 03:46:08 +0530
commiteb7fdb94647c42e31370b7faa1a474a966053f4d (patch)
treedd92063bf58f8724c4d87f2df856ca07d821c930 /activerecord/lib/active_record/relation.rb
parent6f5f23aaa7c4673fe923c6ad1450baaeccb40c02 (diff)
downloadrails-eb7fdb94647c42e31370b7faa1a474a966053f4d.tar.gz
rails-eb7fdb94647c42e31370b7faa1a474a966053f4d.tar.bz2
rails-eb7fdb94647c42e31370b7faa1a474a966053f4d.zip
Make Relation#includes behave exactly like the existing :include option
Diffstat (limited to 'activerecord/lib/active_record/relation.rb')
-rw-r--r--activerecord/lib/active_record/relation.rb33
1 files changed, 30 insertions, 3 deletions
diff --git a/activerecord/lib/active_record/relation.rb b/activerecord/lib/active_record/relation.rb
index fc4d1a6960..c828c0b751 100644
--- a/activerecord/lib/active_record/relation.rb
+++ b/activerecord/lib/active_record/relation.rb
@@ -76,7 +76,7 @@ module ActiveRecord
def to_a
return @records if loaded?
- find_with_associations = @eager_load_associations.any?
+ find_with_associations = @eager_load_associations.any? || references_eager_loaded_tables?
@records = if find_with_associations
begin
@@ -90,7 +90,7 @@ module ActiveRecord
:offset => @relation.skipped,
:from => (@relation.send(:from_clauses) if @relation.send(:sources).present?)
},
- ActiveRecord::Associations::ClassMethods::JoinDependency.new(@klass, @eager_load_associations, nil))
+ ActiveRecord::Associations::ClassMethods::JoinDependency.new(@klass, @eager_load_associations + @include_associations, nil))
rescue ThrowResult
[]
end
@@ -157,7 +157,7 @@ module ActiveRecord
end
def reset
- @first = @last = @create_scope = nil
+ @first = @last = @create_scope = @joined_tables = nil
@records = []
self
end
@@ -216,5 +216,32 @@ module ActiveRecord
@relation.send(:where_clauses).join(join_string)
end
+ def references_eager_loaded_tables?
+ include_eager_order? || include_eager_conditions? || include_eager_select?
+ end
+
+ def include_eager_order?
+ order_clause = @relation.send(:order_clauses).join(', ')
+ (tables_in_string(order_clause) - joined_tables).any?
+ end
+
+ def include_eager_conditions?
+ (tables_in_string(where_clause) - joined_tables).any?
+ end
+
+ def include_eager_select?
+ select_clause = @relation.send(:select_clauses).join(', ')
+ (tables_in_string(select_clause) - joined_tables).any?
+ end
+
+ def joined_tables
+ @joined_tables ||= (tables_in_string(@relation.joins(relation)) + [table.name, table.table_alias]).compact.uniq
+ end
+
+ def tables_in_string(string)
+ return [] if string.blank?
+ string.scan(/([a-zA-Z_][\.\w]+).?\./).flatten.uniq
+ end
+
end
end