订购玩家关于其关联模型的SUM

时间:2012-05-10 00:30:11

标签: ruby-on-rails-3 group-by associations sum has-many

我有一个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')

1 个答案:

答案 0 :(得分:10)

你应该能够使用这样的东西:

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

有关详细信息,请参阅rails api - active record querying