2011-08-30 5 views
2

내 사진보기에는 text_field를 사용하여 검색 할 수있는 옵션이 있습니다. 미리 정의 된 태그를 클릭하여 "검색"옵션을 추가하고 싶었습니다. 아마도 search이 최선의 방법은 아닙니다. 다른 모델에서 SQL 검색으로 필터 필터링

내 모델에서 검색하는 방법입니다 : 내가 제대로 중이를 호출하고 있는지 모르겠어요

def self.search(search) 
    if search 
    where('name or description or tag.name LIKE ?', "%#{search}%") 
    else 
    scoped 
    end 
end 

...하지만이 내가 사진에 대한 인덱스 뷰에서 만든 링크입니다 :

<% @tags.each do |tag| %> 
    <%= link_to tag.name, :search => tag.name, :class => "tag" %> 
<% end %> 

Tags은 사진을 테이블에 아니지만, 사진과 함께 HABTM 관계를 가지고있다. 나는 일반적으로 @ photo.tags.name이나 유사한 것으로 간단하게 호출 할 수 있습니다. 어쨌든 태그를 클릭하면 SQLite3::SQLException: no such column: tag.name: SELECT COUNT(*) FROM "photos" WHERE (name or description or tag.name LIKE '%landscape%')이 다시 나타납니다. 이견있는 사람? 아마 처음부터 이것을 할 수있는 더 좋은 방법이 있을까요?

답변

2

태그 테이블에있는 필드를 찾으려면 해당 태그 테이블과 조인해야합니다. 그것은이 당신의 검색 방법을 변경하려면 : 일반적인 문제에 대한 자신의 솔루션과 함께 오는

def self.search(search) 
    if search 
    joins(:tags).where('name or description or tags.name LIKE ?', "%#{search}%") 
    else 
    scoped 
    end 
end 
+0

굉장! 그래도 작동하지만 태그 필드가 아니라 사진 필드이므로'이름 또는 설명 '을 제거해야합니다. 태그 검색을 위해 별도의 메소드를 생성해야합니까, 아니면'tags.name'가'tags' 테이블에 있고'name or description'이 photos 테이블에있는 동안 지정할 수 있습니까? –

+0

해당 필드가 다른 테이블에 있으면 이벤트를 할 수 있지만이 'joins (: tags) .where ('photos.name 또는 photos.description 또는 tags.name LIKE? ', "% # {search} % ")' – cicloon

+0

트릭을 수행하는 데 감사드립니다. 흥미롭게도 검색 결과에 5 배 이상 나타나는 특정 사진이 있습니다! 정말 이상해. 나는 이유를 알아 내려고 노력할 것이다. –

1

배울 수있는 좋은 방법입니다,하지만 난 당신이 같은 전문 보석에 태그 작업을 위임하는 것이 좋습니다 것입니다 : https://github.com/mbleigh/acts-as-taggable-on이므로 비즈니스에 집중할 수 있습니다.

또한 관계형 모델을 사용하여 태그를 저장하는 것은 다소 과도한 작업입니다. 대부분의 경우 쉼표로 구분 된 태그 목록으로 충분해야합니다.

+1

네, 태그가 어떻게 작동 하는지를 배우기 위해 수동으로 태그를 만들었습니다. 그러나 아마도 그것을 보석으로 바꾸는 것이 이상적 일 것입니다 ... –

관련 문제