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]) 

然后,这会导致对每个候选人进行查询以获得他们的选票。我应该能够在一个查询中做到这一点,但无论我如何更改它,它仍然会分别获取每个候选人的选票。

4

1 回答 1

0

#to_json调用时间时,必须再次获取选票,因此每次额外查询。但是,使用预先加载,无需额外的查询就可以做到这一点:

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

因此,可以通过@candidates包含急切加载来完成,例如:

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

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