aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib
diff options
context:
space:
mode:
authorDavid Heinemeier Hansson <david@loudthinking.com>2005-04-18 05:55:20 +0000
committerDavid Heinemeier Hansson <david@loudthinking.com>2005-04-18 05:55:20 +0000
commit1a6954af01680d18135ce9a50ff273fd81dc6245 (patch)
tree2e2a6cf9892d5f5f785a62859ad2875ef1eefcc0 /activerecord/lib
parentbceb88ef9c402a722caa7441a53f768aa14ab709 (diff)
downloadrails-1a6954af01680d18135ce9a50ff273fd81dc6245.tar.gz
rails-1a6954af01680d18135ce9a50ff273fd81dc6245.tar.bz2
rails-1a6954af01680d18135ce9a50ff273fd81dc6245.zip
Changed habtm eager loading to also use joins
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@1201 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'activerecord/lib')
-rwxr-xr-xactiverecord/lib/active_record/associations.rb36
1 files changed, 10 insertions, 26 deletions
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