假设我有两个类:用户和任务。任务属于用户并具有优先级(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"])
然而,结果不容易排序,我最后必须使用两个循环进行排序,另一个循环用于渲染用户。此外,我认为这种方法在模型中更具逻辑性。
你怎么看?处理这个问题的最简洁方法是什么?答案 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)
如果我理解正确,您希望对具有最高优先级的任务数最多的用户进行排序吗?所以在一个场景中:
你希望输出为:B,A,C?
我只想对任务优先级求和,然后按顺序排序:
User.joins(:tasks).group("users.id").order("SUM(tasks.priority) DESC").first(10)
SQL可能有些偏差,因为我正在写这篇文章,但你希望得到这个想法。这里的诀窍不是SQL,而是你用来排序的加权函数。