When :include is used with a find (or defined within a scope), like for example:
Project.scoped({:include => categories}).find(:limit => 15)
then execution of this results in e.g. these queries:
Project Load (0.005413) SELECT projects.id, title FROM `projects` LIMIT 0, 15
Category Load (0.003505) SELECT `categories`.*, t0.project_id as _parent_record_id FROM `categories` INNER JOIN `categories_projects` as t0 ON `categories`.id = t0.category_id WHERE (t0.project_id IN (1298,1275,1274,1273,1270,1269,1264,1261,1260,1259,1258,1257,1256,1254,1253))
So far so good.
However, when a count is executed on the same scope, the query is like:
SQL (0.013835) SELECT count(DISTINCT `projects`.id) AS count_all FROM `projects` LEFT OUTER JOIN `categories_projects` ON `categories_projects`.project_id = `projects`.id LEFT OUTER JOIN `categories` ON `categories`.id = `categories_projects`.category_id
I expected, based on the first "Project Load" query executed:
SELECT count(DISTINCT `projects`.id) AS count_all FROM `projects`
which should perform a lot better.