2010-07-21 7 views
5

Ruby on Rails에서 문자열을 검색하려면 어떻게해야합니까?Ruby on Rails 3에서 활성 레코드로 텍스트를 검색하는 방법은 무엇입니까?

예를 들어 "text"가 포함 된 열이있는 모든 레코드입니다.

액티브 레코드에 대한 방법이 있습니까? 아니면 SQL에 "좋아요"를 사용해야합니까?

또는 레일에

3 새를 사용하여

Model.where(["name LIKE :tag", {:tag => tag}]) 

로이 쓰기 것 -이 : 태그 @bjg의 의견에 따라 문자열

가 포함 된 변수가

답변

8

Sql like은 매우 비효율적 인 경우가 있습니다 (예 : in many cases in MySQL). Sphinx, Xapian 또는 Lucene과 같은 전체 텍스트 인덱싱 소프트웨어를 사용하는 것이 좋습니다.

+0

과 같이 질의를 작성하여 액티브 레코드에서 검색 할 방법이 없다. 모든 테이블과 열에 한 문자열이 들어 있습니까? –

+0

모든 테이블 검색은 다음과 같은 원시 쿼리로 수행 할 수 있습니다. 'SELECT'table1 'AS 테이블 이름, id FROM 테이블 1 WHERE c1 LIKE "% 텍스트 %"또는 c2 LIKE "% 텍스트 %"UNION ALL SELECT'table2 'AS table_name, id FROM table2 어디에서 c3 LIKE "% text %"',하지만 그렇게하지는 않겠지 만 완전히 어색합니다. MySQL을 사용하고 있다면, http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html과 같은 몇 가지 전체 텍스트 인덱싱 기능이 있습니다. 그러나 나는 그것이 얼마나 좋은지 잘 모릅니다. 필자는 다른 관계형 데이터베이스의 전체 텍스트 검색 지원에 대해 알지 못합니다. 요약 - AR은 도움이되지 않습니다. 가능한 경우 전체 텍스트 인덱싱 소프트웨어를 사용하십시오. – skalee

+0

방금 ​​전에 발견되었지만 http://snowgiraffe.com/rdocs/ar-extensions/classes/ActiveRecord/Base.html – skalee

11
Model.find(:all, :conditions => ['name LIKE ?', "%#{tag}%"]) 

찾기 구문 -

+2

레일즈 3에서는 새로운 파인더 문법 인 – bjg

+0

을 사용하여'Model.where ([ "name LIKE : tag", {: tag => tag}])'라고 쓰고 싶지만 어떻게하면 RoR3 "이름"열뿐만 아니라 해당 모델의 모든 열을 검색 하시겠습니까? –

+0

@never_had_a_name 스핑크스 검색 엔진을 확인하십시오. Check sphinx http://railscasts.com/episodes/120-thinking-sphinx –

3

Arel의 '일치'방법을 사용할 수도 있습니다.

Model.match(:name => tag) 

모든 열을 검색하려면 추가 코드를 작성해야합니다.

+0

나를 위해 일하지 않습니다. – squixy

+0

나를 위해 일하지 않습니다. 'arel'을 사용하면'Model.where (Model.arel_table [: name] .matches ("% # {query_string} %"))' – tsikov

2

내가 acts_as_ferret 플러그인이 사용자의 요구에 완벽 할 것이라고 생각이 플러그인은

ActsAsFerret::define_index('my_index', 
         :models => { 
          SomeModel => { 
          :fields => { 
           :name => { :boost => 4, :store => :yes, :via => :ferret_title }, 
           :foo => { :store => :no, :index => :untokenized }, 
           :baz => { :store => :yes, :via => :ferret_content } 
          } 
          } 
         }) 

모든 acts_as_ferret 인덱스는 하나의 파일로 구성되어 RAILS_ROOT/설정/aaf.rb처럼 쉽게 아주 멋진 인덱스를 구성 할 수 있습니다

+0

흰 족제비는 물론 도움이 될 수 있습니다. 스핑크스의 사고 - 스핑크스는 또한 AR과 잘 통합됩니다. 일반적으로 전체 텍스트 인덱싱 소프트웨어를 사용하는 것이 좋습니다. – skalee

+0

뒷자리에 흰 족제비의 고통이 있습니다. 천천히, 인덱스 손상이 발생하기 쉽고, 문제가 있습니다. 생각 스핑크스는 갈 길입니다. –

2

당신에게 Heroku에 배포하거나 DB를 불가지론을 삭제 괜찮다면, 포스트 그레스는 전체 텍스트 검색을 지원한다. 추가 서비스를 실행할 필요가 없습니다. 게다가 PG는 최고의 운영 체제 데이터베이스입니다. http://tenderlove.github.com/texticle/