PostgreSQL ActiveRecord返回所有记录

时间:2014-04-03 23:04:29

标签: ruby-on-rails postgresql activerecord null

我有这个查询

Person.where('email ~* ?', "(#{params['domains'][0]}|#{params['domains'][1]})")

我想要的行为是返回其电子邮件中包含一个或多个域的所有人。当我的params = {"domains"=>['gmail.com']}我得到每一条记录而不是所有将gmail.com作为其域名的人。

我测试了这一行

Person.where('email ~* ?', "(#{params['domains'][0]}|nil)")

我只获得了gmail.com的记录

如果没有params['domains'][1]则它应该等于nil。发生了什么?

从查看SQL

SELECT COUNT(*) FROM "contacts" WHERE (full_name ~* '(jared|friedman)\s?\w?\s?(jared|friedman)') AND (email ~* '(gmail.com|)')

似乎问题出在(gmail.com|)上。 nil没有被传递

如果域的大小为1,我可以通过有条件地插入false来进行某种攻击。但必须有更好的方法

params['domains'][1] = false if params['domains'].size < 2

1 个答案:

答案 0 :(得分:1)

"nil"不等于"#{nil}"。第二个代码计算为空字符串。如果您想将nil作为字符串,请将其更改为

"(#{params['domains'][0]}|#{params['domains'][1] || 'nil'})")