我正在使用Rails 5和Ransack,我的Mysql db中有一个名为status的列。状态是 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]) }
但这不会返回具有以下 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