2011-09-07 7 views
1

저는 레일즈에 새내기입니다. 나는 이제 검색 쿼리 레일 검색 쿼리를 수행하는 효과적인 방법

myresult = Model1.includes(':model2', ':model3').where("model1.field1 LIKE ? OR model1. field2 LIKE ? OR model2.field1 LIKE ? OR model2.field2 LIKE ? OR model2.field3 LIKE ? OR model3.field1 LIKE ? " value1, value1, value2, value2, value3, value4).select("model1.field1, ..., model1.fieldn, model2.field1.., model3.field2 ")

짓을했는지 나는 이것이 좋은 방법이 아닙니다 들었어요. 내가 아는 다른 사람은 Arel의 조인을 사용한다고 말한 사람입니다. 그러나 Arel은 상대적으로 새로운 것으로 보이고 SQL injection이 자주 발생하는 것처럼 보입니다. 루비 레일에서이 작업을 수행하는 좋은 방법을 제안 할 수 있습니까? 당신은 여러 분야에 걸쳐 전체 텍스트 검색을 수행하려는 경우

당신 사이

+0

model2와 model3에는 많은 관계가 있으며이 쿼리는 정상적으로 작동합니다. 난 단지 레일에 이것을 구현하는 더 좋은 방법을 원한다. –

답변

3

감사, 당신은 SQL에서이 작업을 수행하지 않습니다.

Sphinx 또는 Solr과 같은 특정 전체 텍스트 검색 시스템을 사용해야합니다. 스핑크스 (레일 스핑크스 API)를 생각

체크 아웃 :

http://freelancing-god.github.com/ts/en/

+0

의견을 내 주셔서 감사합니다. 내가하는 어플리케이션은 아키텍처를 소유하고 있지 않기 때문에 스핑크스를 구현하는 것이 어려울 것입니다. 또한 제한을 강조 표시하는 것을 잊어 버렸습니다. 모델을 만지지 않고 있습니다. @allesklar가 내 모듈을 위해 말했듯이 유일한 방법은 Arel 인 것 같습니다 ...! –

+1

헤이 사이, 만약 당신이 직원이나 컨설턴트라면, 이것은 뒤로 물러나야 할 때입니다. - "엉뚱한 일을하시오"- 제약 조건과 함께 이것을 해킹 할 수는 있지만, 고통을 덜어 줄 것입니다. 이 작업에 적합한 도구를 사용하는 것보다 행운을 빕니다! – Winfield

2

당신은 프레임 워크를 싸우고있다. Arel은 질의를하는 레일스의 길을가는 길입니다.

Arel은 제대로 사용하면 SQL 인젝션 경향이 없습니다. 이 페이지를 체크 아웃해야합니다 : http://guides.rubyonrails.org/active_record_querying.html

모델에 일부 범위를 만들고 함께 연결하여 쿼리를 만듭니다.

그러나 Winfield가 말한 것처럼 효율적인 전체 텍스트 검색을 위해서는 Sphinx 또는 Soir를 사용하는 것이 좋습니다.

관련 문제