aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/associations/collection_association.rb
diff options
context:
space:
mode:
authorbeerlington <pete@lette.us>2012-08-05 10:22:05 -0400
committerbeerlington <pete@lette.us>2012-08-05 11:35:18 -0400
commitd1f7590577c61e33bcfa1b146971c47924823238 (patch)
treea5051bc961784669e5c0247da6ef3b75959737ad /activerecord/lib/active_record/associations/collection_association.rb
parentdaf9f9ffa608b24c475403b9a0b3839ca373b2db (diff)
downloadrails-d1f7590577c61e33bcfa1b146971c47924823238.tar.gz
rails-d1f7590577c61e33bcfa1b146971c47924823238.tar.bz2
rails-d1f7590577c61e33bcfa1b146971c47924823238.zip
Changing AR:CollectionAssociation#empty? to use #exists?
COUNT(*) queries can be slow in PostgreSQL, #exists? avoids this by selecting a single record.
Diffstat (limited to 'activerecord/lib/active_record/associations/collection_association.rb')
-rw-r--r--activerecord/lib/active_record/associations/collection_association.rb14
1 files changed, 11 insertions, 3 deletions
diff --git a/activerecord/lib/active_record/associations/collection_association.rb b/activerecord/lib/active_record/associations/collection_association.rb
index f8c1103ea9..a84eda1d3b 100644
--- a/activerecord/lib/active_record/associations/collection_association.rb
+++ b/activerecord/lib/active_record/associations/collection_association.rb
@@ -270,12 +270,20 @@ module ActiveRecord
load_target.size
end
- # Returns true if the collection is empty. Equivalent to
- # <tt>collection.size.zero?</tt>. If the collection has not been already
+ # Returns true if the collection is empty.
+ #
+ # If the collection has been loaded or the <tt>:counter_sql</tt> option
+ # is provided, it is equivalent to <tt>collection.size.zero?</tt>. If the
+ # collection has not been loaded, it is equivalent to
+ # <tt>collection.exists?</tt>. If the collection has not already been
# loaded and you are going to fetch the records anyway it is better to
# check <tt>collection.length.zero?</tt>.
def empty?
- size.zero?
+ if loaded? || options[:counter_sql]
+ size.zero?
+ else
+ !scope.exists?
+ end
end
# Returns true if the collections is not empty.