From fe8fb574c06156ca7eef7367c85bd12991948806 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Tue, 11 Jan 2005 13:21:17 +0000 Subject: [PATCH] Added a differenciation between AssociationCollection#size and -length. Now AssociationCollection#size returns the size of the collection by executing a SELECT COUNT(*) query if the collection hasn't been loaded and calling collection.size if it has. If it's more likely than not that the collection does have a size larger than zero and you need to fetch that collection afterwards, it'll take one less SELECT query if you use length. git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@392 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- activerecord/CHANGELOG | 5 +++++ .../associations/association_collection.rb | 11 ++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG index ee9bc22384..1ca6349117 100644 --- a/activerecord/CHANGELOG +++ b/activerecord/CHANGELOG @@ -1,5 +1,10 @@ *SVN* +* Added a differenciation between AssociationCollection#size and -length. Now AssociationCollection#size returns the size of the + collection by executing a SELECT COUNT(*) query if the collection hasn't been loaded and calling collection.size if it has. If + it's more likely than not that the collection does have a size larger than zero and you need to fetch that collection afterwards, + it'll take one less SELECT query if you use length. + * Added Base#attributes that returns a hash of all the attributes with their names as keys and clones of their objects as values #433 [atyp.de] * Fixed that foreign keys named the same as the association would cause stack overflow #437 [Eric Anderson] diff --git a/activerecord/lib/active_record/associations/association_collection.rb b/activerecord/lib/active_record/associations/association_collection.rb index 6283f3dc28..ca2adaa9c9 100644 --- a/activerecord/lib/active_record/associations/association_collection.rb +++ b/activerecord/lib/active_record/associations/association_collection.rb @@ -70,12 +70,21 @@ def destroy_all @collection = [] end + # Returns the size of the collection by executing a SELECT COUNT(*) query if the collection hasn't been loaded and + # calling collection.size if it has. If it's more likely than not that the collection does have a size larger than zero + # and you need to fetch that collection afterwards, it'll take one less SELECT query if you use length. def size if loaded? then @collection.size else count_records end end + # Returns the size of the collection by loading it and calling size on the array. If you want to use this method to check + # whether the collection is empty, use collection.length.zero? instead of collection.empty? + def length + load_collection.size + end + def empty? - size == 0 + size.zero? end def uniq(collection = self) -- GitLab