2014-07-21 1 views
0

레일스에서 ​​검색 로직을 개선 할 수있는 방법이 있습니다. 예를 들어, 현재 '빨간색 가죽'을 검색하면 빨간색 OR 가죽과 일치합니다. 어떻게하면 검색 로직을 향상 시켜서 '붉은 색 가죽'을 검색하면 '붉은 색 강아지'는 얻지 않지만 '붉은 색 가죽 코트'라고 말하면됩니다. 이상없이 나는 보석없이 이것을하고 싶습니다. 나는 레일 4레일에서 검색 로직을 사용하면보다 정확한 결과를 얻을 수 있습니다.

내 검색 기능의 예와 MySQL을 사용하고하는 것은 여기에

if params[:search_term].present? && params[:search_term].length > 1 
    @candidates = @candidates.where("title like ?","%#{params[:search_term]}%") 
end 

UPDATE

(내 DB에는 검은 고양이가 없습니다) 나는 ''검은 고양이 '를 검색

, 그리고 난 굴복하고이 ...

1m Single Bolster Black Velvet 
1m Straight Back Black Velvet 
70cm Straight Back Black Velvet 

이러한 결과를 부정한다 고양이의 포함 ...

+0

나는 보석을 사용하십시오. 왜 바퀴를 재발견합니까? – DiegoSalazar

+0

내가 성취하고자하는 것이 너무 단순하기 때문에. 분명히 –

+1

당신의 코드가 결과에 대한 당신의 설명에 모순되는 것처럼 보이기 때문에 나는 더 대답하지 않았다. SQL의 % search term %는 실제로 "search term"을 포함하는'title' 내의 하위 문자열만을 찾아야합니다. 여기서 코드에 문제가 보이지 않습니다. – DiegoSalazar

답변

1

공백으로 검색 용어를 분리하고 각각에 대해 호출 할 수 있습니다. Arel에서이 모델이 후보

query = Candidate 
params[:search_term].split(' ').each do |term| 
    query = query.where('title like %?%', term) 
end 
# check it's worked 
puts query.to_sql 
result = query.all 

이것은 당신이 계신해야한다라고 가정하면 당신과 SQL과 ...

에 필터를 계속 추가 할 것이다. '빨간 가죽'은 '가죽으로 만든 빨간 코트'또는 '빨간 주머니가있는 가죽 코트'를 찾아야합니다.

코딩 실습과 관련하여 이것은 실제로 컨트롤러의 모델이 아니라 모델의 한 방법이어야합니다. . 그래서 같이 : 컨트롤러에서 다음

def Candidate.search(search_term) 
    query = Candidate 
    params[:search_term].split(' ').each do |term| 
    query = query.where('title like %?%', term) 
    end 
    result = query.all 
end 

:

def search 
    @candidates = Candidate.search(params[:search_term]) 
end 

이것은 당신이 다음 레이크 작업의 일환으로, 예를 들어, 다른 방법을 사용하거나 인 콘솔에서 수 있음을 의미 문제가있는 경우 디버깅에 유용하거나 검색 방법을 세분화하려고합니다. 귀하의 SQL 잘 작동

1

는 살펴 :

http://ideone.com/Nr1E26

create table tbl(name varchar(20)); 
insert into tbl(name) values("red dog"); 
insert into tbl(name) values("red leather"); 
insert into tbl(name) values("red leather coat"); 

select * from tbl WHERE name LIKE "%red leather%"; 

출력 :

red leather 
red leather coat 
+0

업데이트보기 @Anthony –

+0

업데이트가 진행되지 않지만 새로운 "업데이트"에서 '검은 고양이'와 같거나 아무것도 나타내지 않아도됩니까? – Anthony

+0

당신은 어떤 남자인지 압니다. 나는 무엇보다도 혼란 스러웠다 고 생각합니다. 당신 말이 맞아. 감사 –

관련 문제