0

私には候補者がいて、候補者には多くの投票があるというシナリオがあります。候補者を投票数の多い順に並べたいと思います。このクエリは次のことを行います。

Candidate.joins(:votes).
  select(['candidates.*', 'SUM(votes.score) as total_score']).group('candidates.id, candidates.candidate_id, candidates.user_id, candidates.status, candidates.card_id, candidates.created_at, candidates.updated_at').
  order('candidates.status desc, total_score desc, candidates.created_at asc').where("candidates.riding_id = ? and candidates.status != ?", 124, CandidateStatus::Eligible ).
  having('SUM(votes.score) >= 0')

私の問題は、これを使用してレンダリングすることです:

render :json => @candidates.to_json(:include => [:votes]) 

これにより、各候補のクエリが投票を取得します。1 つのクエリでこれを実行できるはずですが、どのように変更しても、各候補者の投票は個別に取得されます。

4

1 に答える 1

0

が呼び出されるまで#to_jsonに、投票を再度フェッチする必要があるため、クエリが追加されるたびに必要になります。ただし、eager-loading を使用すると、追加のクエリなしでこれを行うことができます。

Candidate.all(:include => :votes).to_json(:include => [:votes])

@candidatesしたがって、次のようなeager-loadingを含めることで実行できます。

@candidates = Candidate.all(:include => :votes)

@candidates.to_json(:include => [:votes])
于 2012-04-27T19:43:32.877 に答える