ふと、悩んだので皆さんのお考えを伺いたく。
Userモデルが存在し
id | 名前(name) | 年齢(age) |
---|---|---|
1 | Suzuki | 50 |
2 | Sato | 30 |
3 | Takahashi | 40 |
4 | Motoki | 22 |
5 | Nagano | 18 |
というデータ構造とします。
このとき、例えば、Suzukiさんの、年齢順(降順)の順位を取得したいという時があると思います。
答えは、1位ですね。
では、これを取得する方法は、なんでしょうか?
今回、データ数が、多くても、数千件と考えたとき、下記で十分では?
user = User.find_by(name: 'Suzuki')
ranked_ids = User.all.order('age desc').select(:id).map(&:id)
ranking = ranked_ids.index(user.id) + 1
と思うのですが、みなさんいかがでしょうか・・・?
・データ数が多くなると、カラムを追加して、バッチ処理で事前計算しておきたい?
・DBによっては、RANK関数が使えるのでそっち使ったほうが早い?
などなど、いろいろ懸念はあるかなと思います。