aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/base.rb
diff options
context:
space:
mode:
authorEmilio Tagua <miloops@gmail.com>2009-08-14 12:33:05 -0300
committerEmilio Tagua <miloops@gmail.com>2009-08-14 12:33:05 -0300
commit9ac01fad193b27e517ea772e0d1e13e06f4ddf34 (patch)
tree87182ceef9887c04ce77c37decdbea408c1e1ebb /activerecord/lib/active_record/base.rb
parentb68ef73344003949e302d784ff3cca6a95192ce0 (diff)
downloadrails-9ac01fad193b27e517ea772e0d1e13e06f4ddf34.tar.gz
rails-9ac01fad193b27e517ea772e0d1e13e06f4ddf34.tar.bz2
rails-9ac01fad193b27e517ea772e0d1e13e06f4ddf34.zip
Use ARel's joins when building a query for finding records with included
associations.
Diffstat (limited to 'activerecord/lib/active_record/base.rb')
-rwxr-xr-xactiverecord/lib/active_record/base.rb21
1 files changed, 15 insertions, 6 deletions
diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb
index e1f4461965..a6832b47ef 100755
--- a/activerecord/lib/active_record/base.rb
+++ b/activerecord/lib/active_record/base.rb
@@ -1741,8 +1741,7 @@ module ActiveRecord #:nodoc:
if array_of_strings?(merged_joins)
merged_joins.join(' ') + " "
else
- join_dependency = ActiveRecord::Associations::ClassMethods::InnerJoinDependency.new(self, merged_joins, nil)
- " #{join_dependency.join_associations.collect { |assoc| assoc.association_join }.join} "
+ build_association_joins(merged_joins)
end
when String
" #{merged_joins} "
@@ -1801,10 +1800,7 @@ module ActiveRecord #:nodoc:
if joins.any?{|j| j.is_a?(String) || array_of_strings?(j) }
joins = joins.collect do |join|
join = [join] if join.is_a?(String)
- unless array_of_strings?(join)
- join_dependency = ActiveRecord::Associations::ClassMethods::InnerJoinDependency.new(self, join, nil)
- join = join_dependency.join_associations.collect { |assoc| assoc.association_join }
- end
+ join = build_association_joins(join) unless array_of_strings?(join)
join
end
joins.flatten.map{|j| j.strip}.uniq
@@ -1813,6 +1809,19 @@ module ActiveRecord #:nodoc:
end
end
+ def build_association_joins(joins)
+ join_dependency = ActiveRecord::Associations::ClassMethods::InnerJoinDependency.new(self, joins, nil)
+ relation = arel_table
+ join_dependency.join_associations.map { |association|
+ if association.relation.is_a?(Array)
+ [Arel::InnerJoin.new(relation, association.relation.first, association.association_join.first).joins(relation),
+ Arel::InnerJoin.new(relation, association.relation.last, association.association_join.last).joins(relation)].join()
+ else
+ Arel::InnerJoin.new(relation, association.relation, association.association_join).joins(relation)
+ end
+ }.join(" ")
+ end
+
# Object#to_a is deprecated, though it does have the desired behavior
def safe_to_array(o)
case o