I’m unable at the moment to track down when I started seeing a SELECT COUNT(*) call in my development log but it is happening and there doesn’t seem to be a reason for it. I’d like to know if this is normal and/or why it is happening. I don’t think it’s a major problem but why have an extra call to the database if I don’t need it.
In my controller I have
def some_action
@activities = user.activities
end
In the User class, I have that it has_many :activities
and when I call this action, my log output is
User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
(0.3ms) SELECT COUNT(*) FROM "activities" WHERE "activities"."user_id" = 1
Activity Load (0.3ms) SELECT "activities".* FROM "activities" WHERE "activities"."user_id" = 1
All I can tell you for sure is that it didn’t use to do that SELECT COUNT(*) call and as far as I can tell, there is nothing trying to get that count.
I’m using Rails 3.2.6 and PostgreSQL 9.
I’ve found the reason for the count query is due to Rails’ lazy loading and the order in which I’m using my data.
While I iterate over all the
@activities, the first thing I do with the instance variable in my view template is check if there are any to go through. If not I display something different to the user.@activities.empty?is performing the count and comparing it to 0 which is more efficient than loading all the records into an array and then checking that. I can optionally change my action to bewhich prevents the COUNT call and loads all records before constructing the view.