我有这个查询
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
答案 0 :(得分:1)
"nil"
不等于"#{nil}"
。第二个代码计算为空字符串。如果您想将nil
作为字符串,请将其更改为
"(#{params['domains'][0]}|#{params['domains'][1] || 'nil'})")