2010-06-19 80 views
1

我正在爲用戶配置文件創建最受歡迎的活動部分。我沒有任何困難通過user_id提取問題,但我無法通過相關整數進行排序:question.votes.size。這可能是一個簡單的問題,但如何排序然後將輸出限制爲3?我如何做到這一點,而不會滯後數據庫?最終會有很多票數被計算在內。這應該是一個named_scope?如何通過Ruby on Rails中的連接整數對數組進行排序?

@user_id = User.find_by_username(params[:username]).id 
    questions = Question.find(:all, :conditions => {:user_id => @user_id }) 

回答

2

我想在彈出,並提出另一種方式是,也許,一個做到這一點位更多原生RoR。 :-)

@user = User.find_by_username(params [:username],:include => [{:questions =>:votes}]) @sorted_questions = @ user.questions.sort {| q1,q2 | q2.votes.length < => q1.votes.length}

這具有許多優點:

1)任何SQL寫入,保持DB便攜性,更易於閱讀() 2)可釋放DB?的排序計算,應當比例更好

和幾個缺點:

1)作品紅寶石硬,高延遲在低負荷,減少對單個盒 2)移動更多的數據有效,潛在地減輕優點#2

理想情況下,您需要查看ActiveRecord的計數器緩存功能。它通過將子行數反規範化到父表中來自動緩存關係計數。爲了工作,所有的子行處理都必須通過父對象進行,但這是Rails在任何情況下的最佳實踐。

在問題中擁有投票計數緩存將消除在查詢中引用投票表的需要。從性能和代碼美學的角度來看,這樣做和在Ruby中排序可能是理想的情況。

最後,我不得不承認,在Rails 3的非常酷的關係代數材料上踢球。有了它,這很可能是一個超級可讀的單線程產生最佳SQL。那會有多酷? :-)

+0

嘿湯姆!感謝您的迴應,它的工作。儘管如此,我怎麼能限制輸出呢?我想保持它3次。 – user250181 2010-06-19 06:59:26

+1

如果你想在前三個問題,他們已經排序後,使其'@sorted_questions = @ user.questions.sort {| q1,q2 | q2.votes.length <=> q1.votes.length} .first(3)' – Chubas 2010-06-19 16:47:20

1

我假設每個問題都有很多選票。

您可以通過使用

Question.find_by_sql(" 
    SELECT question.*, COUNT(votes.id) as vote_count 
    FROM questions 
    LEFT JOIN votes on questions.id = votes.question_id 
    GROUP BY questions.id 
    ORDER BY vote_count DESC 
"); 

什麼大體相當(我沒有測試)

+0

感謝您的回覆,我添加了這段代碼,但是一旦我的部分嘗試從問題中提取屬性,它就會中斷。它給了我:缺少的屬性:消息。有任何想法嗎? – user250181 2010-06-19 04:06:50

+0

哎呦:我有'FROM votes'而不是'FROM questions'。試試看。仍然不確定它在語法上是否正確。 – 2010-06-19 04:12:40

+0

Sill得到相同的錯誤。 – user250181 2010-06-19 04:15:14

相關問題