Skip to content

Instantly share code, notes, and snippets.

@AquaGeek
Created May 14, 2011 02:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AquaGeek/971750 to your computer and use it in GitHub Desktop.
Save AquaGeek/971750 to your computer and use it in GitHub Desktop.
Rails Lighthouse ticket #6164
From 1c3650832d03c3e96e46ffa777da786ef9e7fa1b Mon Sep 17 00:00:00 2001
From: Joseph Palermo <pair+jpalermo@pivotallabs.com>
Date: Wed, 16 Mar 2011 23:29:46 +0800
Subject: [PATCH] Remove extra select table.* when association class has default_scope with a select
---
.../associations/preloader/association.rb | 6 +++++-
.../preloader/has_and_belongs_to_many.rb | 4 ++++
activerecord/test/cases/relation_scoping_test.rb | 5 +++++
activerecord/test/models/person.rb | 1 +
activerecord/test/models/reference.rb | 5 +++++
5 files changed, 20 insertions(+), 1 deletions(-)
diff --git a/activerecord/lib/active_record/associations/preloader/association.rb b/activerecord/lib/active_record/associations/preloader/association.rb
index 7256dd5..e2b040d 100644
--- a/activerecord/lib/active_record/associations/preloader/association.rb
+++ b/activerecord/lib/active_record/associations/preloader/association.rb
@@ -97,7 +97,7 @@ module ActiveRecord
scope = scope.where(process_conditions(options[:conditions]))
scope = scope.where(process_conditions(preload_options[:conditions]))
- scope = scope.select(preload_options[:select] || options[:select] || table[Arel.star])
+ scope = scope.select(select_scope_values)
scope = scope.includes(preload_options[:include] || options[:include])
if options[:as]
@@ -111,6 +111,10 @@ module ActiveRecord
scope
end
+ def select_scope_values
+ preload_options[:select] || options[:select]
+ end
+
def process_conditions(conditions)
if conditions.respond_to?(:to_proc)
conditions = klass.send(:instance_eval, &conditions)
diff --git a/activerecord/lib/active_record/associations/preloader/has_and_belongs_to_many.rb b/activerecord/lib/active_record/associations/preloader/has_and_belongs_to_many.rb
index 24be279..f203018 100644
--- a/activerecord/lib/active_record/associations/preloader/has_and_belongs_to_many.rb
+++ b/activerecord/lib/active_record/associations/preloader/has_and_belongs_to_many.rb
@@ -44,6 +44,10 @@ module ActiveRecord
super.joins(join).select(join_select)
end
+ def select_scope_values
+ super || table[Arel.star]
+ end
+
def join_select
association_key.as(Arel.sql(association_key_name))
end
diff --git a/activerecord/test/cases/relation_scoping_test.rb b/activerecord/test/cases/relation_scoping_test.rb
index cda2850..f9e5b4d 100644
--- a/activerecord/test/cases/relation_scoping_test.rb
+++ b/activerecord/test/cases/relation_scoping_test.rb
@@ -268,6 +268,11 @@ class HasManyScopingTest< ActiveRecord::TestCase
magician = BadReference.find(1)
assert_equal [magician], michael.bad_references
end
+
+ def test_should_use_default_select_scope_on_associations
+ michael = Person.where(:id => people(:michael).id).includes(:favouriteless_references).first
+ assert_equal false, michael.favouriteless_references.first.attributes.has_key?('favourite')
+ end
end
class HasAndBelongsToManyScopingTest< ActiveRecord::TestCase
diff --git a/activerecord/test/models/person.rb b/activerecord/test/models/person.rb
index cc3a4f5..c859e5b 100644
--- a/activerecord/test/models/person.rb
+++ b/activerecord/test/models/person.rb
@@ -7,6 +7,7 @@ class Person < ActiveRecord::Base
has_many :references
has_many :bad_references
+ has_many :favouriteless_references
has_many :fixed_bad_references, :conditions => { :favourite => true }, :class_name => 'BadReference'
has_one :favourite_reference, :class_name => 'Reference', :conditions => ['favourite=?', true]
has_many :posts_with_comments_sorted_by_comment_id, :through => :readers, :source => :post, :include => :comments, :order => 'comments.id'
diff --git a/activerecord/test/models/reference.rb b/activerecord/test/models/reference.rb
index 06c4f79..22f0c4d 100644
--- a/activerecord/test/models/reference.rb
+++ b/activerecord/test/models/reference.rb
@@ -19,3 +19,8 @@ class BadReference < ActiveRecord::Base
self.table_name ='references'
default_scope :conditions => {:favourite => false }
end
+
+class FavouritelessReference < ActiveRecord::Base
+ self.table_name = 'references'
+ default_scope select(column_names - ['favourite'])
+end
--
1.7.3
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment