2012-09-24 6 views
2

블로그 앱에 태그 시스템을 구현하고 있습니다. 이 응용 프로그램은 게시물을 가지고, 게시물은 taggings을 통해 많은 태그가 있습니다. 더 많은 이하 나는 여러 같은 태그가 게시물 선택 확인란을 사용 # 382 http://railscasts.com/episodes/382-tagging여러 태그가있는 게시물 선택

RailCasts 같은 : 내가 대신 게시물의 필요한 모든 태그가 게시물에 가입하려는 경우

Post.joins(:tags).where(:tags => { :id => [tag_ids] }) 

그러나 무엇을 그 하나의 요구 사항 만 충족합니까?

exapmle를 들어

:

Post1 태그 "foo는, 바, 바즈"

Post2는 태그가 "바 바즈"가

포스트 3 태그 "바"

내가 검색하는 경우가 있습니다 [ "bar", "baz"]에 대해 내 메소드는 게시물 1, 2 및 3을 반환합니다. 게시물 1 및 2 만 반환하려면 어떻게해야합니까?

답변

2

SQL에서는 위의 코드는 tag_ids는 ID의 배열이라고 가정

Post.joins(:tags).select('posts.id').where(:tags => { :id => [tag_ids] } 
).having("count(tags.name) = ?", tag_ids.count).group('posts.id') 

로는 번역

GROUP BY posts.id 
HAVING count(tags.name) = 2 

에서 같은 레일을 할 것입니다. 또한 반환 된 ActiveRecord Post 객체 집합의 ID 만로드합니다.

필드를 추가로로드하려면 select 호출에 필드를 추가하거나 그렇지 않으면 select 호출을 제거하여 모든 게시 필드를로드하십시오. 결과 SQL 쿼리에서 검색되는 Post의 모든 열/필드에 대해 해당 필드를 group 호출에 추가해야합니다.

+0

잘 작동합니다. 어쨌든 tag_ids.count는 NameError를 반환합니다 : 정의되지 않은 지역 변수 또는 메쏘드'tag_ids 'for main : Object – TopperH

+0

tag_ids가 배열이라고 가정했습니다. 나는 "id0, id1, id2"형식의 문자열 일 것 같아요. 이 경우 tag_ids.split (",") .count를 사용하여 일치해야하는 번호를 얻을 수 있습니다. – zeikt

관련 문제