在Rails中,如何按任务优先级对用户进行排序

时间:2012-09-10 17:52:00

标签: ruby-on-rails ruby-on-rails-3

假设我有两个类:用户和任务。任务属于用户并具有优先级(1到3之间的整数,或者为nil)。

class User < ActiveRecord::Base
    has_many :tasks

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

我希望提供具有最多任务数量和最高优先级的前十名用户(首先按高优先级排序然后按中等然后低而不进行评估)。我想到了一个不同的方式,但我找不到一个干净的方法来处理这个。

我首先想到在控制器的方法中使用复杂的SQL请求来限制性能:

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

然而,结果不容易排序,我最后必须使用两个循环进行排序,另一个循环用于渲染用户。此外,我认为这种方法在模型中更具逻辑性。

你怎么看?处理这个问题的最简洁方法是什么?

2 个答案:

答案 0 :(得分:1)

你可以使用以下内容,试试这个:

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

我认为这会奏效。虽然没有经过测试。

答案 1 :(得分: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,而是你用来排序的加权函数。