ransack rails:不适用于使用* _in匹配器的空值

时间:2018-08-08 05:27:26

标签: ruby-on-rails ransack

我需要搜索可以在其中选择多个下拉菜单的地方(例如:状态为“有效”,“”)

我尝试过

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

,它返回类似

的结果
select * from users where status in ("active")

但预期结果应该是

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

我该如何使用ransack做到这一点?(获取状态为空且处于“活动”状态的用户列表)

1 个答案:

答案 0 :(得分:1)

  

我该如何使用ransack做到这一点?(获取状态为空且处于“活动”状态的用户列表)

我想您的目标是获得users为空的or有效状态。那么您可能需要一个单独的predicate

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

然后使用OR group the queries

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')