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')
4

1 回答 1

10

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

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

有关详细信息,请参阅 rails api -活动记录查询

于 2012-05-10T07:58:28.347 回答