2

次のモデルの関連付けがあります: 学生モデルと has_many スコア。

名前と平均、最小、最大スコアを示すリストを作成する必要があります。これまでのところ、各学生で student.scores.average(:score) を使用していますが、学生ごとに 1 つの sql を実行していることに気付きました。結合された1つのSQLでリストを作成するにはどうすればよいですか?

また、Will_Paginate プラグインでどのように使用しますか?

ありがとうございました

4

1 に答える 1

1

Student.findに:groupandオプションが必要です。: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

于 2010-03-29T05:35:13.040 に答える