2011-07-31 4 views
11

내 개발 데이터베이스는 SQLite이지만 Heroku에 내 응용 프로그램을 배포하고 PostgreSQL을 사용하고 있습니다.Postgres 대/소문자를 구분하지 않고 레일을 사용하여 검색

PostgreSQL이 대소 문자를 구분하지만 SQLite가 아니기 때문에 검색을 수행하면 두 가지 결과가 나올 수 있습니다.

레일스가 표준화하지 않아야합니까? 이를 해결하기 위해 어떤 방법을 사용해야합니까? 포스트 그레스에서

Here is how to fix it with raw SQL

+1

Heroku에 배포하는 경우 PostgreSQL을 기반으로 개발하는 것이 좋습니다. ORM은 데이터베이스 관련 동작으로부터 사용자를 보호하지 않습니다. –

+1

그리고 SQLite를 로컬에서 사용하고 Postgre를 사용하여 배송하기 때문에 특정 DB에 묶여 있지 않습니다. 각자 자신에게. –

답변

41

대소 문자 구분 검색 :

  • 사용 ilike 대신 (대소 문자 구분 등) like
  • 당신은 =을 사용하여 양쪽 UPPER 또는
  • 을 LOWER 중 하나를 만들고 싶어
+4

감사합니다. 'like' 문제는'OR' 연산자로 그것들을 연결하는 법을 모른다는 것입니다. 레일에 의해 지원되는 모든 DB에서 이것을 사용하지 않아도됩니까? ('% # {search_term} % ') " – antpaw

+1

잘 MySQL, sqlite, pgsql 내 코드를 제동하지 않습니다. – antpaw

+0

MYSQL과 POSTGRES 모두에서 동일한 코드를 실행하려면 UPPER 또는 LOWER를 사용하십시오 (분명히 모범 사례는 아니지만!) –

4

또 다른 DDL 처리 방법은입니다.데이터 유형 또는 대소.자를 구분하지 않는 TEXT.

4

ActiveRecord가 처리하지 못하는 경우가 많으며 LIKE 일치가 그 중 하나입니다. 여기에 바로 Arel을 사용하여 이것을 달성하는 방법이 있습니다.

Model.where(
    Model.arel_table[:title].matches("%#{search_term}%") 
) 

당신은 할 Arel-Helpers를 설치할 수 있습니다이 좀 더 쉽게

Model.where(Model[:title].matches("%#{search_term}%")) 

내가 이전에이에 대한 Squeel을 권장하지만, 원래의 작성자를 지원 중지하고 풀 수없는 것 시간 개발자가 그것을 유지합니다. 그리고 개인용 ActiveRecord API를 사용하므로 일정한 경향이 필요합니다.

+0

훌륭한 해결책이며 Squeel은 훌륭하지만, Postgres에 고유 한 동작입니다. 다른 RDBMS에 대해이 작업을 수행하려는 경우 출력 결과는 대소 문자를 구분할 수 있습니다. – kgx

+0

@kgx 실제로이 예제는 두 경우 모두 의도 한대로 작동합니다. @antpaw가 위에서 말했듯이, SQLite'LIKE'는 기본적으로 대소 문자를 구별하지 않습니다. 그래서 이것은 SQLite에서는'LIKE'을, PostgreSQL에서는 ILIKE를 사용할 것입니다. –

관련 문제