public
Description: Ruby on Rails
Homepage: http://rubyonrails.org
Clone URL: git://github.com/rails/rails.git
Fixed STI type condition for eager loading of associations

Signed-off-by: Pratik Naik <pratiknaik@gmail.com>
Tarmo Tänav (author)
Fri Aug 15 16:24:29 -0700 2008
lifo (committer)
Sat Aug 16 12:41:19 -0700 2008
commit  2b69a636c431d62a85b2896d87b69cb13e2b8af0
tree    56490c5c00af972feaa9e80432303d124ecc6150
parent  8f4d3957a6986fe450cfd9058bb92ae1d6e5e745
...
2099
2100
2101
2102
2103
2104
2105
 
 
2106
2107
2108
...
2099
2100
2101
 
 
 
 
2102
2103
2104
2105
2106
0
@@ -2099,10 +2099,8 @@ module ActiveRecord
0
                 else
0
                   ""
0
               end || ''
0
-              join << %(AND %s.%s = %s ) % [
0
-                connection.quote_table_name(aliased_table_name),
0
-                connection.quote_column_name(klass.inheritance_column),
0
-                klass.quote_value(klass.sti_name)] unless klass.descends_from_active_record?
0
+              join << %(AND %s) % [
0
+                klass.send(:type_condition, aliased_table_name)] unless klass.descends_from_active_record?
0
 
0
               [through_reflection, reflection].each do |ref|
0
                 join << "AND #{interpolate_sql(sanitize_sql(ref.options[:conditions]))} " if ref && ref.options[:conditions]
...
1609
1610
1611
1612
 
 
1613
1614
1615
 
 
1616
1617
1618
...
1609
1610
1611
 
1612
1613
1614
 
 
1615
1616
1617
1618
1619
0
@@ -1609,10 +1609,11 @@ module ActiveRecord #:nodoc:
0
           sql << "WHERE #{merged_conditions} " unless merged_conditions.blank?
0
         end
0
 
0
-        def type_condition
0
+        def type_condition(table_alias=nil)
0
+          quoted_table_alias = self.connection.quote_table_name(table_alias || table_name)
0
           quoted_inheritance_column = connection.quote_column_name(inheritance_column)
0
-          type_condition = subclasses.inject("#{quoted_table_name}.#{quoted_inheritance_column} = '#{sti_name}' ") do |condition, subclass|
0
-            condition << "OR #{quoted_table_name}.#{quoted_inheritance_column} = '#{subclass.sti_name}' "
0
+          type_condition = subclasses.inject("#{quoted_table_alias}.#{quoted_inheritance_column} = '#{sti_name}' ") do |condition, subclass|
0
+            condition << "OR #{quoted_table_alias}.#{quoted_inheritance_column} = '#{subclass.sti_name}' "
0
           end
0
 
0
           " (#{type_condition}) "
...
68
69
70
 
 
 
 
 
 
 
 
 
 
 
 
71
72
73
...
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
0
@@ -68,6 +68,18 @@ class CascadedEagerLoadingTest < ActiveRecord::TestCase
0
     end
0
   end
0
 
0
+  def test_eager_association_loading_with_has_many_sti_and_subclasses
0
+    silly = SillyReply.new(:title => "gaga", :content => "boo-boo", :parent_id => 1)
0
+    silly.parent_id = 1
0
+    assert silly.save
0
+
0
+    topics = Topic.find(:all, :include => :replies, :order => 'topics.id, replies_topics.id')
0
+    assert_no_queries do
0
+      assert_equal 2, topics[0].replies.size
0
+      assert_equal 0, topics[1].replies.size
0
+    end
0
+  end
0
+
0
   def test_eager_association_loading_with_belongs_to_sti
0
     replies = Reply.find(:all, :include => :topic, :order => 'topics.id')
0
     assert replies.include?(topics(:second))

Comments