我有一个场景,我有候选人和候选人有很多投票。我想以最高票数到最低票数的顺序排列候选人。此查询执行此操作:
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])
这会导致每个候选人的查询得到他们的投票。我应该可以在一个查询中执行此操作,但无论我如何更改它,它仍然会分别抓住每个候选人的投票。
答案 0 :(得分:0)
当调用#to_json
时,必须再次获取投票,因此每个附加查询。但是,使用预先加载,可以在没有其他查询的情况下执行此操作:
Candidate.all(:include => :votes).to_json(:include => [:votes])
因此,可以使用@candidates
来完成,包括预先加载,例如:
@candidates = Candidate.all(:include => :votes)
@candidates.to_json(:include => [:votes])