diff --git a/activerecord/lib/active_record/association_preload.rb b/activerecord/lib/active_record/association_preload.rb index 61fa34a..ae064ec 100644 --- a/activerecord/lib/active_record/association_preload.rb +++ b/activerecord/lib/active_record/association_preload.rb @@ -220,12 +220,16 @@ module ActiveRecord klass_name, id_map = *klass_and_id klass = klass_name.constantize + # do not find if there are no ids + uniq_ids = id_map.keys.uniq + next if uniq_ids.empty? + table_name = klass.quoted_table_name primary_key = klass.primary_key conditions = "#{table_name}.#{connection.quote_column_name(primary_key)} IN (?)" conditions << append_conditions(options, preload_options) column_type = klass.columns.detect{|c| c.name == primary_key}.type - ids = id_map.keys.uniq.map do |id| + ids = uniq_ids.map do |id| if column_type == :integer id.to_i elsif column_type == :float diff --git a/activerecord/test/cases/associations/eager_test.rb b/activerecord/test/cases/associations/eager_test.rb index e78624a..2072757 100644 --- a/activerecord/test/cases/associations/eager_test.rb +++ b/activerecord/test/cases/associations/eager_test.rb @@ -633,4 +633,17 @@ class EagerAssociationTest < ActiveRecord::TestCase def test_order_on_join_table_with_include_and_limit assert_equal 5, Developer.find(:all, :include => 'projects', :order => 'developers_projects.joined_on DESC', :limit => 5).size end + + def test_no_null_queries + # has author_address and author_address_extra records + assert_queries(3) do + Author.find(1, :include => ['author_address', 'author_address_extra']) + end + + # has no author_address or author_address_extra records + assert_queries(1) do #should not do 1 query per subclass + Author.find(2, :include => ['author_address', 'author_address_extra']) + end + end + end