大多数关于高级排序的问题都涉及一些优先领域,但这里有一个不同的问题。
我有一系列按标题排序的项目,这些项目分配给公司的个人。我希望能够让每个人的项目浮动到那个人的顶部。
这不是到assigned_individual
那时订购的请求job_title
(因为这会弄乱所有不属于我的项目的订购)。这是一个请求,要求记录仍然主要按顺序排序,job_title
但要进行覆盖,以便assigned_individual_id = 3
首先显示具有的记录。
大多数关于高级排序的问题都涉及一些优先领域,但这里有一个不同的问题。
我有一系列按标题排序的项目,这些项目分配给公司的个人。我希望能够让每个人的项目浮动到那个人的顶部。
这不是到assigned_individual
那时订购的请求job_title
(因为这会弄乱所有不属于我的项目的订购)。这是一个请求,要求记录仍然主要按顺序排序,job_title
但要进行覆盖,以便assigned_individual_id = 3
首先显示具有的记录。
不难,您只需将 CASE 滑入 ORDER BY 即可手动将感兴趣的行推到顶部,如下所示:
id = M.send(:sanitize_sql, ['?', id])
M.order("case when assigned_individual = #{id} then 0 else 1 end, job_title")
当然,id
您想要的用户在哪里。如果这是在 M 的一种方法中完成的,那么您将不需要使用send
来绕过sanitize_sql
.
如果需要,可以轻松扩展此技术以将多个用户推到顶部。
分两遍构建它:
@projects = current_user.projects
@projects += Project.all
@projects.uniq!
注意:我假设您已使用默认范围按名称对项目进行排序。