0

假设我有两个类:用户和任务。一个任务属于一个用户并且有一个优先级(它是一个介于 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

我想展示任务数量最多且优先级最高的 TOP 10 用户(首先按高优先级排序,然后是中等优先级,然后是低优先级,然后未评估)。我想到了一种不同的方法,但我找不到一种干净的方法来处理这个问题。

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

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

但是结果不容易排序,我最终不得不使用两个循环进行排序,另一个循环来呈现用户。此外,我认为这种方法在模型中会更合乎逻辑。

你怎么看?处理这个最干净的方法是什么?

4

2 回答 2

1

您可以使用以下方法,只需尝试以下操作:

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

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

于 2012-09-10T18:02:06.233 回答
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,不如说是用于排序的加权函数。

于 2012-09-10T18:04:54.280 回答