
[code]

    @english = Point.where(subject: english).order(subject_point: "DESC").first
    @japaneese = Point.where(subject: japanese).order(subject_point: "DESC").first
    
[/code]

と、各科目を条件に点数の高い順に並び替えて、最初のデータを抽出するというやり方しか思いつきません。  
各科目を個別に抽出せず、一度に抽出できるやり方などないでしょうか。


CC BY-SA 3.0
2018-03-23T07:33:24.647
42601
2018-03-23T22:21:07.633
2018-03-23T07:37:55.650
19110
25446
question
ruby-on-rails ruby
各教科の中から一番点数のいい点を抽出する方法


ActiveRecordはSQLを隠蔽してくれますが、SQLの知識がないとActiveRecordでどう書いたらいいかわからないとか、典型的にバッドプラクティスとされるようなコードを書いてしまうとか、そういうことになります。結局SQLやデータベースの知識は必要です。

値がほしいだけなら、SQLで書くと

[code]

    SELECT subject, max(subject_point) FROM points GROUP BY subject
    
[/code]

こうなります。SQLではごく初歩になります。これがわかればActiveRecordで`GROUP BY`やら`max`がどう書けるかを考えればよいので、

[code]

    subject_points = Point.group(:subject).maximum(:subject_point)
    subject_points["english"]
    
[/code]

こういう風にしてとれることがわかります。

最大値を含む行の他のレコード全体を取得したい場合、SQL自体が複雑になりますので、これをActiveRecordで書くのも面倒になります。とはいえFAQの類いなので情報はたくさんあります。興味があれば調べてみてください。

「同じ問い合わせをパラメータを変えてループで回す」というのが典型的なバッドプラクティスの例です。SQLをベースに考えるとそもそもループということが（簡単には）出来ないので、ループで回すようなコードは何かおかしい、という考え方が出来るようになります。


CC BY-SA 3.0
2018-03-23T22:21:07.633
42619
2018-03-23T22:21:07.633
5793
42601
answer