2017-07-19 82 views
2

我正在開發一款應用程序,它是一款紙牌遊戲。每張卡都存放在一張桌子(卡片)中,並有一定數量的點數。如果一個用戶贏得一張卡,他就會獲得這張卡的積分。在這種情況下,記錄保存在保存有card_id,user_idsuccess = true的user_card表中(如果他丟失了卡,它是success = false)。Rails集團和總計

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_cards,成功= true以USER_ID
  2. 總和的所有點由用戶(其存儲在卡表)成功user_cards
  3. 顯示的用戶名(從用戶表)與此用戶

點的總和我試着像GROUP_BY一些方法(&:東西),加入等。但是,我不能使它發揮作用。當我不得不從一張表中分組和彙總東西時,我沒有問題。但是,我不知道如何根據user_card表獲取用戶名和來自另一個表的點數。

我該如何做到這一點?

回答

2
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 
+0

確實有效。我意識到我錯過了原始文章中的重要信息:每次用戶播放一張卡片時,都會將其存儲在user_card中。該表包含一個名爲「成功」的布爾值 - 如果用戶贏了,則爲「true」,否則爲「false」。我更新了我原來的帖子。 – Oliver

+0

太棒了!您的更新有效!最後一個問題:我現在怎樣才能以總分來降序呢? (在排行榜中,我想要一個包含所有用戶的列表並按積分降序排列) – Oliver

+0

就是這樣!你爲我節省了很多時間!謝謝! – Oliver