GROUP BY and COUNT using ActiveRecord GROUP BY and COUNT using ActiveRecord ruby ruby

GROUP BY and COUNT using ActiveRecord


Distinct and Group By are going to give you different results. To get the results you expect you'll want to use

Person.group(:name).count(1.2ms)  SELECT COUNT(*) AS count_all, name AS name FROM "people" GROUP BY "people"."name"=> {"Dan"=>3, "Dave"=>2, "Vic"=>1} 

Seen above, group will return things as a hash. While distinct just returns the number of people in total, seen below.

Person.distinct(:name).count(0.4ms)  SELECT DISTINCT COUNT(DISTINCT "people"."id") FROM "people"=> 6 


Note that the accepted answer will return a hash:

Tagging.joins(:tag).group(:name).size   (0.4ms)  SELECT COUNT(*) AS count_all, `name` AS name FROM `taggings` INNER JOIN `tags` ON `tags`.`id` = `taggings`.`tag_id` GROUP BY `name` => {"applesauce"=>1, "oranges"=>2} 

But what if you want to return the count plus some columns from different tables in a join. Then you also need to use the select ActiveRecord query:

collection = Tagging.select('COUNT(*) as total, taggings.taggable_id, taggings.taggable_type').joins(:tag).where(taggable_type: 'LineItem', taggable_id: ['5cad0dcc3ed1496086000031', '5cad0dcd3ed1496086000081'] ).group(:name)collection.each do |item|  puts item.taggable_id  puts item.totalend5cad0dcc3ed149608600003115cad0dcc3ed14960860000312

With this second approach, you can fetch additional details about a join relationship without any additional queries or loop constructs.


another option:

Person.select(:name, 'COUNT(name)').group(:name)

this generate an array of people with attribute count