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

时间:2017-07-07 15:04:32

标签: mysql ruby-on-rails rails-activerecord ransack

我在Ransack上使用Rails 5,我的Mysql数据库中有一个名为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])

1 个答案:

答案 0 :(得分:1)

你可以将范围链接在一起就好了,你甚至可以只做asc_no_approved.approved但我认为它返回零对象的原因是因为你正在寻找状态不为0的所有东西,然后询问对于此集合中状态为0的东西。

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

如果您想将approved的结果字面附加到asc_no_approved,那么您可以approved + asc_no_approved