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

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

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

我能够按升序获取对象,而无需使用 status == 0 的对象:

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

以及 status == 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 }

这是我在 Controller 中的调用:

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

最佳答案

您可以像这样将范围链接在一起,您甚至可以只执行 asc_no_approved.approved 但我认为它返回零对象的原因是因为您正在寻找状态不是的所有内容0,然后询问这个集合中status为0的东西。

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

如果您想将 approved 的结果逐字追加到 asc_no_approved 中,那么您只需执行 approved + asc_no_approved

关于mysql - Rails 5 使用 Ransack,自定义范围顺序进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44974061/

相关文章:

php - 如何使用时间戳对元素进行计数

php - 关于从 MySQL 中获取 PHP 数据表的建议

java - mysql中有没有办法区分两个相同但大小写字母不同的字符串

ruby-on-rails - 无法在 Webpacker 中的 vuex 突变测试中导入 vue.esm.js

ruby-on-rails - Rails 有许多动态条件子句

java - Kotlin 。 Java 和 PHP 与 MySQL 的性能

ruby-on-rails - 默认情况下是否可以从我的 Rails 应用程序中删除 public/index.html?

ruby-on-rails - 从原始 sql 查询返回具有多个键/值对的哈希

sql - Rails include() 带有自定义 ON 子句的 LEFT OUTER JOIN

ruby-on-rails - Rails 控制台复杂查询