我有一个列为job_type
的作业表,job_type
可以是top
、hot
或normal
。现在,当我列出所有作业时,我希望首先显示top
作业,然后是hot
作业,最后是normal
作业。我还想按(created_at: :desc)
的降序对作业进行排序。我有以下范围
class Job < ApplicationRecord
scope :hot_jobs, -> { where(job_type: 'hot') }
scope :top_jobs, -> { where(job_type: 'top') }
scope :normal_jobs, -> { where(job_type: 'normal') }
end
我尝试了什么
在控制器中,我尝试了类似的东西
@jobs = Job.hot_jobs.order(created_at: :desc).or(Job.top_jobs.order(created_at: :desc)).or(Job.normal_jobs.order(created_at: :desc))
但是上面的代码不起作用。以上编码结果与Job.all.order(created_at: :desc)
相同
那么,我如何按照Top Jobs
、Hot Jobs
和Normal Jobs
的顺序列出作业呢。如果我使用array,我可以做一些破解,但我不想将ActiveRecord#Relations
转换为array,因为这会给will_paginate
带来问题,而且我不能使用includes
来阻止N + 1
查询
我使用的是Rails 6.0.4.1
更新
我将job_type
列更改为integer
,但我无法进行
@jobs = Job.active.order(job_type: :asc, created_at: :desc).limit(48)
这个问题解决了。
只需在订单中使用case语句。
Rails6中的技巧是将其封装在Arel.sql中,否则您将得到一个";非属性参数";错误
@jobs = Job.all.order(
Arel.sql(
"case when job_type = 'top' then 1
when job_type = 'hot' then 2
else 3 end asc"), created_at: :desc)
如果您在作业中有默认的订单范围,只需将order
更改为reorder