Ruby Length Size Count Dilemma
There has been many times when we have multiple options to achieve something. One of them is using ruby’s length, count and size. Which one to use when ?
In Ruby, arrays and hashes, size
is an alias for length
. They can be called as synonyms and do exactly the same thing. Whereas count
is also same if no element is there, but if it is there, then it returns the number of items it matches.
Ex:
> [1,2,3].count{|z| z < 2 }
=> 1
So basically all are same in terms of result, but they differ in performance.
size
and length
as I have mentioned are exactly same (i.e. same performance). However count
without element takes more time to execute than length.
Above was all about Ruby, but it has all together different when it comes to active record. Lets dive right into it:
TLDR: Use size
.
length
: It will force load all the data and then perform length operation.
>> user.tasks.length
Task Load (0.720687) SELECT * FROM tasks WHERE (tasks.user_id = 2343)
=> 216
This is bad. We do not want to load all data into memory to get the no. of items.
count
: It will query the database with count.
>> user.tasks.count
SQL (0.070607) SELECT count(*) FROM tasks WHERE (tasks.user_id = 2343)
=> 216
Nice. We get what we want, without loading all data.
size
: This is will give the no. of tasks without a query if the tasks are already loaded, or else perform the count database query.
>> user.tasks.size
SQL (0.070607) SELECT count(*) FROM tasks WHERE (tasks.user_id = 2343)
=> 216
>> tasks = user.tasks
>> tasks.size
=> 216
Awesome. It is smart. It detects when to do what. Use size
.