Rails 5 使用 Ransack,自定义范围顺序进行排序

Rails 5 using Ransack, custom scope order for sorting

我将 Rails 5 与 Ransack 一起使用,并且我有一个模型,在我的 Mysql 数据库中有一列名为状态。状态是 0-5 之间的整数。我正在尝试在此列上创建一个默认排序,其中它是升序的,除了状态为 0 的最后一个(1、2、3、4、5、0)。

我能够按升序获取对象,而没有状态 == 0 的对象:

  scope :asc_no_approved, lambda { where.not(status: [0]).order('status ASC') }

状态 == 0 的对象具有:

  scope :approved, lambda { where(status: [0]) }

有没有办法将第二个作用域附加到第一个作用域的末尾?我试过了:

scope :asc_approved_last, lambda { where.not(status: [0]).order('status ASC').where(status: [0]) }

但是 returns 没有对象 Mysql:

SELECT  `requests`.* FROM `requests` WHERE (`requests`.`status` != 0) AND `requests`.`status` = 0 ORDER BY status ASC LIMIT 10 OFFSET 0

更新:

由于下面的评论有些令人困惑,如果其他人正在尝试解决此问题,那么这对我有用。根据接受的答案,这些是我的范围:

scope :asc_no_approved, lambda { where.not(status: [0]).order('status ASC') }
scope :approved, lambda { where(status: [0]) }
scope :asc_approved_last, lambda { asc_no_approved + approved }

这是我在控制器中的调用:

@requests = Kaminari.paginate_array(@q.result.includes(:employee, :user, :title).asc_approved_last).limit(10).page(params[:page])

你可以像这样很好地将范围链接在一起,你甚至可以只做 asc_no_approved.approved 但我认为它返回零对象的原因是因为你正在寻找状态不为 0 的所有事物,并且然后询问状态为0的这个集合的东西。

WHERE (`requests`.`status` != 0) AND `requests`.`status` = 0

如果你想将 approved 的结果直接附加到 asc_no_approved 那么你可以只做 approved + asc_no_approved