2012-09-10 68 views
0

假設我有兩個類:用戶和任務。任務屬於用戶並且具有優先級(其是1到3之間的整數,或零)。在Rails中,我如何按任務優先級排序用戶

class User < ActiveRecord::Base 
    has_many :tasks 

class Task < ActiveRecord::Base 
    belongs_to :user 
    attr_accessible :priority # Integer between 1 and 3, or nil 

我想(通過高優先級排序第一,然後再中低則未評估)用戶呈現的TOP 10的任務次數最多和最高的優先級。我想到了一種不同的方式,但我找不到一個乾淨的方式來處理這個問題。

我首先想到使用控制器的方法的複雜SQL請求限制性能:

User.joins(:tasks).count(:all, :group => ["tasks.user_id", "priority"]) 

然而結果是不容易的排序,我終於有機會使用兩個循環進行排序和另一個呈現用戶。此外,我認爲這種方法在模型中更合乎邏輯。

您認爲如何?處理這個問題的最簡潔的方法是什麼?

回答

1

如果我理解正確,您想對具有最高優先級權限的任務數量最多的用戶進行排序嗎?因此,在一個場景:

  • 用戶A有3個任務,2個優先級爲1和1 3
  • 用戶B擁有2個任務,2具有優先級3
  • 用戶C有1個任務優先級爲2

而且你會希望輸出是:B,A,C?

我只想總結的任務優先級,並進行排序,最後則:

User.joins(:tasks).group("users.id").order("SUM(tasks.priority) DESC").first(10) 

的SQL可能有點過,因爲我寫這篇關閉我的頭頂部,但你希望得到的想法。這裏的訣竅不在於SQL,而在於用來排序的權重函數。

+0

太棒了,我雖然錯過了一個rails查詢函數,但沒有它只有SQL。謝謝 ! – Nibbler

1

您可以使用下面,就試試這個:

User.select("users.id, count(tasks.id) as task_count"). 
joins(:tasks).group("users.id").order("task_count desc").first(10) 

這將工作,我想。雖然沒有測試。

+0

太棒了,我雖然錯過了一個rails查詢函數,但沒有它只有SQL。謝謝 ! – Nibbler