2012-04-26 26 views
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]) 

這就導致每個候選人獲得選票的查詢。我應該可以在一個查詢中做到這一點,但不管我如何改變它,它仍然分別抓取每個候選人的選票。

回答

0

在調用#to_json時,必須再次提取投票,因此每個額外的查詢。使用急切加載,但是,它有可能做到這一點沒有額外查詢:

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

@candidates.to_json(:include => [:votes]) 
+0

文檔說:

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

因此,它可以與@candidates包括渴望加載,如完成使用.joins(:votes)是現在包含的正確方法。在任何情況下,這兩種方法都行不通 - 它可能在做所有的時候都起作用,但這並不符合我如何總結這些選票和訂單的要求。 – Codezy 2012-05-02 18:04:29

+0

@Codezy:根據我的理解,'join'與'include'不一樣,在所有情況下'include'也不是一個替代物(http://railscasts.com/episodes/181-include-vs-joins )。 'include'將引用表的屬性加載到內存中,'joins'只執行一個SQL JOIN(可以使用構建查詢中的'.to_sql'方法進行檢查)。我認爲你可能想在這種情況下包含' - 當然,在測試我上面寫的查詢的同時,這導致了所需的行爲,而不會導致多個查詢。不過,這可能是一個更好的方法。 – tiredpixel 2012-05-02 21:41:24

+0

@Codezy:啊,看來Rails 3中的命名更改爲'includes',並且'.includes'結構也存在。對於你提到的特定代碼,你可以簡單地將'.joins'改爲'.includes'(不能測試你的特定查詢,因爲沒有設置所有模型),或者將其包含在鏈中。但是仔細想想你在做什麼,而不是更多地使用它,因爲它比普通查詢的'join'效率低得多。 – tiredpixel 2012-05-02 21:46:20