2010-06-06 4 views
44

현재 개발 환경을 sqlite3에서 postgresql 8.4로 바꾸고 마지막 장애물이 하나 있습니다.레일스에서 ​​postgresql을 사용하여 대소 문자를 구별하지 않는 방법

내 원본에는 헬퍼 메서드에서 다음 줄이 있습니다.

result = Users.find(:all, :order => "name collate NOCASE") 

매우 멋진 대/소문자 구분 검색을 제공했습니다. 나는 postgresql을 위해 이것을 복제 할 수 없다. 쉬워야한다 - 어떤 아이디어?

감사합니다.

답변

77
result = Users.find(:all, :order => "LOWER(name)") 

브래드 (Brad)와 프랭크 (Frank) 모두 조금 있습니다.

+0

니스, 그 감사를했다. 나 자신을 위해 이것에 대해 조금 더 배울 올바른 방향으로 나를 가리켰다. UPPER (이름)을 사용하는 것도 효과가 있으며 실제로 특별한 이유없이 제 코드에서 끝났습니다. – brad

+2

내가 극복 한 더 극단적 인 해결책은 원본 열을 추적하는 별도의 열을 추가하는 것입니다. 삽입 또는 업데이트시 트리거를 사용하여 해당 열을 수정하십시오. 나는 이것을 과거 몇 시간 동안 사용했는데, 무언가의 제목을 분류하고 "a, an,"의 선도 단어가 포함되는 것을 원하지 않았습니다. 나는 또한 모든 특수 문자를 제거했다. 이로 인해 "제목", "제목", "제목", "제목"이 서로 흩어져 있지 않고 서로 정렬되었습니다. 또한 "제목 V"를 "제목 IX"앞에 올릴 수 있도록 정렬 가능한 필드를 편집 할 수있게했습니다. – LanceH

+1

'default_scope'에 이것을 사용하려면'default_scope order ('LOWER (name) ASC')'를 사용하십시오. 세부 사항을 파악하기 위해 약간의 나를 잡았다. –

5

SQL의 경우 ORDER BY LOWER (columnname)을 사용할 수 있습니다. Ruby에서이를 수행하는 방법을 알지 못합니다. 기능 색인 (LOWER (columnname)에도 있음)은 작업 속도를 높이는 데 도움이됩니다.

6

열을 citext 유형으로 저장하는 것이 좋습니다. 그것은 실제로 그것을 이해하는 것처럼 lower()에 대한 호출을 내부화합니다. 나중에 자동으로 자동으로 실행됩니다. 대소 문자를 구별하는 검색이 필요한 경우가 있지만 이것이 최선의 방법은 아닙니다.

+0

흥미 롭 군. 그것은 나에게 새로운 유형입니다. 8.4에서이 기능을 사용하려면 개별적으로 citext 모듈을 설치해야합니다 (그러나 9.0에 내장 될 것임). 이것은 내 코드의 이식성에 영향을 미치므로 지금은 생략하겠습니다. 지금은 대/소문자를 구분하지 않고 검색 할 필요는 없지만 이번에는 옵션을 계속 열어두고 싶습니다. 지금이 옵션을 남겨 두겠습니다. 매우 감사합니다. 감사합니다. – brad

23

LanecH의 인기 대답은 레일에 맞게 3+ (레일 포함 4) :

users = User.order('LOWER(name)') 

# or create a named scope you can reuse 
class User < ActiveRecord::Base 
    scope :order_by_name, -> { order('LOWER(name)') } 
end 

users = User.order_by_name 
관련 문제