2014-04-03 4 views
0

나는이 쿼리PostgreSQL의 액티브는

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

내가 원하는 동작은 누구의 이메일 도메인을 하나 이상 포함 된 모든 사람을 반환하는 것입니다에게 있습니다. 내 params = {"domains"=>['gmail.com']} gmail.com을 도메인의 일부로 갖는 모든 사람들 대신 모든 단일 레코드를받습니다.

나는이 라인

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

을 테스트 한 후이 nil 동일해야 params['domains'][1]가없는 경우 내가 gmail.com

만 기록을 얻었다. 무슨 일이야? 는 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

"nil""#{nil}" 같지 않은 더 나은 방법을이 있어야합니다. 두 번째 코드는 빈 문자열로 평가됩니다. 당신이 문자열로 nil을 원하는 경우에, 그것을했다

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

그래로 변경 – Patrick