活动记录以特定方式排序的结果



我有一个列为job_type的作业表,job_type可以是tophotnormal。现在,当我列出所有作业时,我希望首先显示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 JobsHot JobsNormal 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

相关内容

  • 没有找到相关文章

最新更新