【问题标题】:Group and sum in RailsRails 中的分组和求和
【发布时间】:2017-07-19 20:23:12
【问题描述】:

我正在开发一款纸牌游戏应用。每张卡都存储在一个表(卡)中,并具有一定数量的点数。如果用户赢得一张卡,他将获得这张卡的积分。在这种情况下,user_card 表中保存了一条记录,其中包含card_iduser_idsuccess = true(如果他丢失了卡,则为success = false)。

card.rb

class Card < ActiveRecord::Base
  has_many :user_cards
  has_many :users, through: :user_cards
end

user_card.rb

class UserCard < ActiveRecord::Base
  belongs_to :user
  belongs_to :card
end

我现在要做的是创建一个排行榜。因此我需要:

  1. 按 user_id 对所有成功 = true 的 user_card 进行分组
  2. 对用户成功的 user_cards 的所有积分(存储在卡表中)求和
  3. 显示用户名(来自用户表)和该用户的总分

我尝试了一些方法,例如 group_by(&:something)、joins 等。但是,我无法让它发挥作用。当我必须对单个表中的内容进行分组和汇总时,我没有问题。但是,我不知道如何从一个表中获取用户名,并根据 user_card 表从另一个表中获取积分。

我怎样才能做到这一点?

【问题讨论】:

    标签: ruby-on-rails ruby activerecord


    【解决方案1】:
    users = User.joins(:cards).
                 select(:username, 'sum(cards.score) as score').
                 where(user_cards: {success: true}).
                 group(:id).
                 order('score desc')
    #=> #<ActiveRecord::Relation [#<User username: 'bob'>]>
    
    users.first.username
    #=> "bob"
    
    users.first.score
    #=> 15
    

    【讨论】:

    • 确实可行。我意识到我错过了原始帖子中的重要信息:每次用户打牌时,都会将其存储在 user_card 中。该表包含一个名为“成功”的布尔值 - 如果用户获胜,则为“真”,否则为“假”。我更新了我原来的帖子。
    • 太棒了!您的更新有效!最后一个问题:我现在如何按分数总和降序排列? (在排行榜中,我想要一个所有用户和点按降序排列的列表)
    • 就是这样!你为我节省了很多时间!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多