Fixed eager load error on find with include => [:table_name] and hash conditions like {:table_name => {:column => 'value'}}

Signed-off-by: Michael Koziarski <michael@koziarski.com>
This commit is contained in:
Anthony Crumley 2009-05-04 09:49:43 -05:00 committed by Michael Koziarski
parent 9e0cfdb7f9
commit 026b78f907
2 changed files with 28 additions and 4 deletions

View File

@ -1671,17 +1671,29 @@ module ActiveRecord
string.scan(/([\.a-zA-Z_]+).?\./).flatten
end
def tables_in_hash(hash)
return [] if hash.blank?
tables = hash.map do |key, value|
if value.is_a?(Hash)
key.to_s
else
tables_in_string(key) if key.is_a?(String)
end
end
tables.flatten.compact
end
def conditions_tables(options)
# look in both sets of conditions
conditions = [scope(:find, :conditions), options[:conditions]].inject([]) do |all, cond|
case cond
when nil then all
when Array then all << cond.first
when Hash then all << cond.keys
else all << cond
when Array then all << tables_in_string(cond.first)
when Hash then all << tables_in_hash(cond)
else all << tables_in_string(cond)
end
end
tables_in_string(conditions.join(' '))
conditions.flatten
end
def order_tables(options)

View File

@ -223,6 +223,18 @@ class EagerAssociationTest < ActiveRecord::TestCase
end
end
def test_eager_association_loading_with_belongs_to_and_conditions_hash
comments = []
assert_nothing_raised do
comments = Comment.find(:all, :include => :post, :conditions => {:posts => {:id => 4}}, :limit => 3, :order => 'comments.id')
end
assert_equal 3, comments.length
assert_equal [5,6,7], comments.collect { |c| c.id }
assert_no_queries do
comments.first.post
end
end
def test_eager_association_loading_with_belongs_to_and_conditions_string_with_quoted_table_name
quoted_posts_id= Comment.connection.quote_table_name('posts') + '.' + Comment.connection.quote_column_name('id')
assert_nothing_raised do