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 に答える