微炭酸ログ

Ruby や Rails を中心に。

【Ruby】複数キーの降順ソート

試合結果から順位表を自動生成する機能を作りました。

とりあえず勝ち点をキーにしてソートすれば順位は出せます。

が、要件の都合上、勝ち点が並んだ場合に順位決定戦が別途あり、その勝敗は勝ち点に影響せず、順位表示だけに影響します。

 

つまり、

1位 XX大学 勝ち点12

1位 AA大学 勝ち点12

 

で並んだ時に順位決定戦となり、XX大学が勝利した場合、

1位 XX大学 勝ち点12

2位 AA大学 勝ち点12

 

と表示したいわけです。

 

以下のように順位決定戦の勝利として勝ち点+3してもダメですし、

1位 XX大学 勝ち点15

2位 AA大学 勝ち点12

 

勝ち点だけで順位決定していると1位が2つ並んでしまいます。

1位 XX大学 勝ち点12

1位 AA大学 勝ち点12

 

ということで順位決定戦用の勝ち点を別途フィールドとして用意し、

順位決定ロジック(ソート実行)の要素に組み込みました。

つまり、「リーグ戦勝ち点」キー と「順位決定戦勝ち点」キーの2つのキーでソートさせました。

 

rank_infos = team_results.sort_by do |a|
[-a.point, -a.playoff_point]
end

 

降順ソートの場合はマイナスをつけます。

 

現行サイトでは(順位決定戦の有無にかかわらず)順位は手入力で運用しているそうなので、ここを順位決定戦の考慮まで入った「自動化」として実装できたのはすごく良かったです。

全然簡単なコードですが、勉強になりました。

 

<参考>

blog.livedoor.jp

oar.st40.xyz