From 1a6954af01680d18135ce9a50ff273fd81dc6245 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Mon, 18 Apr 2005 05:55:20 +0000 Subject: Changed habtm eager loading to also use joins git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@1201 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- activerecord/lib/active_record/associations.rb | 36 +++++++------------------- 1 file changed, 10 insertions(+), 26 deletions(-) (limited to 'activerecord/lib/active_record/associations.rb') diff --git a/activerecord/lib/active_record/associations.rb b/activerecord/lib/active_record/associations.rb index b1daf3df1e..fffd695294 100755 --- a/activerecord/lib/active_record/associations.rb +++ b/activerecord/lib/active_record/associations.rb @@ -708,16 +708,10 @@ module ActiveRecord def construct_finder_sql_with_included_associations(options, schema_abbreviations, reflections) habtm_associations = reflections.find_all { |r| r.macro == :has_and_belongs_to_many } - sql = "SELECT #{column_aliases(schema_abbreviations)} FROM #{table_name}" - add_habtm_join_tables!(habtm_associations, sql) - sql << " " - + sql = "SELECT #{column_aliases(schema_abbreviations)} FROM #{table_name} " add_association_joins!(reflections, sql) sql << "#{options[:joins]} " if options[:joins] - - add_habtm_conditions!(habtm_associations, options) add_conditions!(sql, options[:conditions]) - sql << "ORDER BY #{options[:order]} " if options[:order] return sanitize_sql(sql) @@ -727,35 +721,25 @@ module ActiveRecord schema_abbreviations.collect { |cn, tc| "#{tc.join(".")} AS #{cn}" }.join(", ") end - def add_habtm_join_tables!(habtm_associations, sql) - return if habtm_associations.empty? - sql << ", " + habtm_associations.collect { |a| [ a.klass.table_name, a.options[:join_table] ] }.join(", ") - end - - def add_habtm_conditions!(habtm_associations, options) - return if habtm_associations.empty? - options[:conditions] = [ - options[:conditions], - habtm_associations.collect { |r| - join_table = r.options[:join_table] - "#{join_table}.#{table_name.classify.foreign_key} = #{table_name}.#{primary_key} AND " + - "#{join_table}.#{r.klass.table_name.classify.foreign_key} = #{r.klass.table_name}.#{r.klass.primary_key}" - } - ].compact.join(" AND ") - end - def add_association_joins!(reflections, sql) reflections.each { |reflection| sql << association_join(reflection) } end def association_join(reflection) case reflection.macro + when :has_and_belongs_to_many + " LEFT OUTER JOIN #{reflection.options[:join_table]} ON " + + "#{reflection.options[:join_table]}.#{reflection.options[:foreign_key] || table_name.classify.foreign_key} = " + + "#{table_name}.#{primary_key} " + + " LEFT OUTER JOIN #{reflection.klass.table_name} ON " + + "#{reflection.options[:join_table]}.#{reflection.options[:associated_foreign_key] || reflection.klass.table_name.classify.foreign_key} = " + + "#{reflection.klass.table_name}.#{reflection.klass.primary_key} " when :has_many, :has_one - " LEFT JOIN #{reflection.klass.table_name} ON " + + " LEFT OUTER JOIN #{reflection.klass.table_name} ON " + "#{reflection.klass.table_name}.#{reflection.options[:foreign_key] || table_name.classify.foreign_key} = " + "#{table_name}.#{primary_key} " when :belongs_to - " LEFT JOIN #{reflection.klass.table_name} ON " + + " LEFT OUTER JOIN #{reflection.klass.table_name} ON " + "#{reflection.klass.table_name}.#{reflection.klass.primary_key} = " + "#{table_name}.#{reflection.options[:foreign_key] || reflection.klass.table_name.classify.foreign_key} " else -- cgit v1.2.3