質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

3885閲覧

同率順位を考慮したランキング

Gr.

総合スコア89

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

1グッド

1クリップ

投稿2018/10/15 03:40

状況:

<データ>

idnamescore
1A200
2B100
3C200
4D500
5E300
```controller
def index
@test = Test.order('score desc')
end
```
```html
<table>
<tr>
<th>順位</th> <th>名前</th> <th>スコア</th>
</tr> <% @test.each.with_index(1) do |f,i| %> <tr> <td><%= i %></td> <td><%= f.name %></td> <td><%= f.score %></td> </tr> <% end %> </table> ``` 結果: |順位|名前|スコア| |:--:|:--:|:--:| |1|D|500| |2|E|300| |3|A|200| |4|C|200| |5|B|100|

これではwith_indexで単純に番号を振っているだけなので、同率順位は考慮されません。
同率順位を考慮するにはどうしたらいいのでしょうか。

|順位|名前|スコア|※|
|:--:|:--:|:--:|
|1|D|500|
|2|E|300|
|3|A|200|
|4|C|200|←ここの順位を3or空欄にしたい|
|5|B|100|

※調べてみるとredisを使ってうんぬんと出てくるのですが、こちらプログラミング新入生でしてredisが何かさっぱりわかりません。もちろん追々勉強すべきでしょうが、今はあまり広範囲に手を付けたら混乱しそうで…

このredisなるものを使わないと同率順位を考慮したランキングの作成はできない(あるいはかなり複雑になる)のでしょうか???

同率順位を考慮するロジックは、スコア(x)の値以上のスコアが何件あるかを数えて+1すればいいと思いますが、これはredis以外では書けないのでしょうか???

jsで同じ値が入った<td>を取得して、その<tr>のtd:first-childの文字を消す、的なことはできないでしょうか。
または、他にもっとシンプルにできる書き方はないでしょうか。

よろしくお願いいたします。

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yoorwm

2018/10/15 03:57

表示する際の順位だけなら<%= i %>で出さないで、別に順位を加算しつつ表示するだけでいいのではないでしょうか?データからなんとかしたいのならテーブル構造を追記しておくといいかと思います。
Gr.

2018/10/15 04:01

yoorwmさん 追記・修正依頼ありがとうございます。 「別に順位を加算しつつ表示する」とはどういうことでしょうか。すみません、飲み込み悪いもので。
guest

回答2

0

ベストアンサー

一般にランク付け処理はSQL側で行います

SQL

1create table tbl(id int,name varchar(10),score int); 2insert into tbl values(1,'A',200),(2,'B',100),(3,'C',200),(4,'D',500),(5,'E',300);

SQL

1select id,(select count(*)+1 from tbl where score>t1.score) as rank ,name,score from tbl as t1 order by rank asc

※各SQLの書式にあわせてください

投稿2018/10/15 04:10

yambejp

総合スコア114742

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Gr.

2018/10/15 04:25

yambejpさん 回答ありがとうございます! ちょっと難しくて、いくつかお尋ねしたいです。 回答の中で insert into tbl values(1,'A',200),… とありますが、これはベタ打ち?というかデータベースから引っ張ってくるのではなく手書きなのでしょうか。 というのも、質問の例では5つのデータで順位を出していますが、実際に作る場合は例えば「500あるデータから上位20件をランキング表示」的な感じにしたいのですが。 すみません、本当にド素人ですのでお手柔らかにお願いいたします。
yambejp

2018/10/15 04:49 編集

上の方のSQLはサンプルデータ用です。 サンプルデータがないと例示できないので念の為書いておきました 逆にGr.さんが例示されたままのデータのはずですが・・・ 下の方のSQLがランク付けされたデータ一覧です。 SQLの種類によってはランク用の関数が予め用意されている場合もあります
guest

0

あくまで「表示だけの場合」という縛りで
rubyの文法とか慣れてないので考え方をだけ書くと

順位を表す変数 rank 前ループで表示したscore prev <% @test.each.with_index(1) do |f,i| %> prev と f.score が同じならば rankを表示する でなければ rank = rank + 1 //ランクを1つ進める prev = f.score // 今回のスコアを覚えておいて、次回の比較に備える <% end %>

投稿2018/10/15 05:42

yoorwm

総合スコア1305

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問