次のモデルの関連付けがあります: 学生モデルと has_many スコア。
名前と平均、最小、最大スコアを示すリストを作成する必要があります。これまでのところ、各学生で student.scores.average(:score) を使用していますが、学生ごとに 1 つの sql を実行していることに気付きました。結合された1つのSQLでリストを作成するにはどうすればよいですか?
また、Will_Paginate プラグインでどのように使用しますか?
ありがとうございました
次のモデルの関連付けがあります: 学生モデルと has_many スコア。
名前と平均、最小、最大スコアを示すリストを作成する必要があります。これまでのところ、各学生で student.scores.average(:score) を使用していますが、学生ごとに 1 つの sql を実行していることに気付きました。結合された1つのSQLでリストを作成するにはどうすればよいですか?
また、Will_Paginate プラグインでどのように使用しますか?
ありがとうございました
Student.findに:group
andオプションが必要です。:select
これはあなたのために働くはずです:
students = Student.all(
:select => "
students.*,
AVG(scores.score) as avg_score,
MIN(scores.score) as min_score,
MAX(scores.score) as max_score",
:joins => :scores
:group => 'students.id')
計算された列は実際の列と同じように利用できますが、明らかに保存されません
students.first.avg_score
students.first.min_score
students.first.max_score
WillPaginate を使用するには、:page、:per_page、... オプションを含めて、Student.paginate
代わりに呼び出しますfind
。オプションが原因でページネーションが間違ったページ数を取得していることが判明した場合は、これを引数に:group
追加するだけです::total_entries => Student.count