Suganya Selvarajan
Suganya Selvarajan

Reputation: 1092

Rails - Postgres - Group by associated Object count

I have a User model and a Redemption model. An user can make multiple redemptions. I want to get the number of users who have made 1 redemption, 2, 3,....

User Model

has_many :redemptions, foreign_key: :redeemed_by

Redemption Model

belongs_to :user, foreign_key: :redeemed_by

I could run the following query and get redemptions against each user.

 User.joins(:redemptions).group('redemptions.redeemed_by').count

Result:

{185=>2, 187=>1, 2042=>4, 2544=>1} 

which gives me the count of redemptions each user has made. But I want the reverse. I want how many users have made 1 redemptions, how many 2 and goes on...

I want to achieve this through Rails query.

Upvotes: 2

Views: 117

Answers (1)

Gautam
Gautam

Reputation: 1812

You can do this

User.joins(:redemptions)
    .group('redemptions.redeemed_by').count
    .group_by{|k,v| v}
    .map{|k,v| [k, v.size]}.to_h

returns

{1=>2, 4=>2, 5=>1}

where 1, 4 and 5 (the keys) are the number of redemptions and 2, 2, 1 (the values) are the number of users who have redemeed this many times.

Upvotes: 3

Related Questions