首页 > 解决方案 > ransack rails:不适用于使用 *_in 匹配器的空值

问题描述

我需要搜索可以选择多个下拉列表的位置(例如:状态为“活动”、“”)

我试过了

User.ransack({status_in: ['active', ''])

它返回结果如

select * from users where status in ("active")

但预期的结果应该是

select * from users where ("users"."deleted" != 't') AND status in ("active","")

我如何使用 ransack 来实现这一点?(获取状态为空且“活动”的用户列表)

标签: ruby-on-railsransack

解决方案


我如何使用 ransack 来实现这一点?(获取状态为空且“活动”的用户列表)

我想你的目标是获得users空的or活动状态。那么你可能需要一个单独的谓词

*_blank谓词使用 SQL: 检查属性是否为空或为空col is null OR col = ''

然后使用以下方法对查询进行分组OR

User.ransack(status_in: ['active'], status_blank: true, m: 'or')

它生成以下 SQL:

SELECT  "users".* FROM "users" WHERE ("users"."status" IN ('active') OR ("users"."status" IS NULL OR "users"."status" = ''))

如果您需要再添加一个条件,那么像Rails查询一样链接它怎么样,因为ransack只需生成ActiveRecord::Relation

User.ransack(deleted_not_eq: 't').result
  .ransack(status_in: ['active'], status_blank: true, m: 'or')

推荐阅读