2012-05-10 65 views
5

我有一個數據庫與6500 players和每個球員有平均15場比賽results訂購球員對他們的協會模型的總和

使用情況

我要生成的球員名單,由他們獎金總和(在結果表中的字段)排序。 我寧願這是在某種範圍內,所以我還可以過濾玩家的國家名單等

性能

我已經看到,提cache_counter領域表現的帖子。在我的案例中,我有成千上萬的結果記錄(75.000+),所以我不希望每次有人訪問生成的列表時都進行計算。

問題

什麼是解決這個最好的模式?我如何實現它?

模式

class Player < ActiveRecord::Base 
    has_many :results 
end 

class Result < ActiveRecord::Base 
    belongs_to :player 
end 

架構

create_table "players", :force => true do |t| 
    t.string "name" 
    t.string "nationality" 
    end 

    create_table "results", :force => true do |t| 
    t.integer "player_id" 
    t.date  "event_date" 
    t.integer "place" 
    t.integer "prize" 
    end 

更新

我試圖做到的是讓到一個地步,我可以使用:

@players = Player.order_by_prize 

@players = Player.filter_by_country('USA').order_by_prize('desc') 

回答

10

你應該能夠使用這樣的事情:

class Player 
scope :order_by_prize, joins(:results).select('name, sum(results.prize) as total_prize').order('total_prize desc') 

參考軌API - active record querying瞭解詳情。

+4

我不得不對你的建議做一些調整,現在它準確地按照他們的獎品總數排序:'scope:order_by_prize,joins(:results).select('players.id,players.name,sum(results .prize)as total_prize')。group('players.id')。order('total_prize desc')'。但是,結果只顯示'player.id'和'player.name',而不是'total_prize'結果? –

+0

順便說一下,我做了這些調整,因爲我使用的是PostgreSQL,並且在控制檯中它告訴我在運行代碼後包含group by子句。 –

+0

沒關係!在控制檯中'total_prize'不會顯示在結果輸出的屏幕上,但屬性已正確設置並可用。非常感謝你:) –