2013-05-03 63 views
1

我在我的Rails應用程序中的User.rb模型上有一個方法,該方法根據用戶對網站的各種貢獻返回信譽分數。如何按方法結果排序

def total_votes 
    answerkarma = AnswerVote.joins(:answer).where(answers: {user_id: self.id}).sum('value') 
    contributionkarma = Contribution.where(user_id: self.id).sum('value') 

    answerkarma + contributionkarma 
    end 

在我的想象中的藝術家控制器的索引動作,有時我檢索所有的藝術家,有時我只檢索那些位置

def index 


    if params[:province_id] 
    province = params[:province_id] 
    province = province.to_i 
    @artistsbyprovince = User.artists_by_province(province) 

    else 

    @artists = User.where(:onionpealer => true) 

    end 


    end 

如果我按位置過濾,用戶模型過濾調用此方法的範圍

scope :artists_by_province, lambda {|province| 
     joins(:contact). 
     where(contacts: {province_id: province}, 
      users: {onionpealer: true}) 
     } 

我今天準備這樣做,但是,在這兩種情況下(無論是位置還是檢索所有用戶過濾)是排序的藝術家的檢索通過total_votes方法的結果,使得具有最高點數的藝術家出現在頂部。

你能建議我該怎麼做。先謝謝你。

回答

1

如果沒有對錯查詢體系結構講究,排序可以通過紅寶石array#sort_by

@artistsbyprovince = User.artists_by_province(province).sort_by{ |u| -u.total_votes } 
+0

謝謝,但一個問題做了。它以最低票數迴歸用戶。他們應該在頂部。另外,當你說「如果不注意錯誤的查詢架構」,你的意思是什麼,我不明白。 – Leahcim 2013-05-03 14:44:25

+0

更新我的答案,以改變排序方向 – MikDiet 2013-05-03 14:46:45

+0

我的意思是,如果你有很多用戶,比如說說10000 ++,那麼從數據庫中提取它們並在ruby中進行排序是非常耗時和耗費內存的操作。正確的方法是在數據庫中緩存投票並在sql查詢中進行排序。 – MikDiet 2013-05-03 14:49:14