2010-07-29 3 views
0

다음과 같은 문제가 조금 있습니다. 나는 두 가지 모델이 있습니다사용중인 모든 태그 찾기

class Book < ActiveRecord:Base 
    has_and_belongs_to_many :tags 
end 

class Tag < ActiveRecord:Base 
    has_and_belongs_to_many :books 
end 

나는 특정 있지만, 태그 테이블에 사용할 수 없습니다 수있는 태그의 목록이 있습니다

이 tag1, tag2로, TAG3, tag4, tag5을 ...

각 새 책에는 여러 개의 태그가있을 수 있습니다. 평소처럼 관계는 조인 테이블 "books_tags"에 저장됩니다.

하나 이상의 책과 관련된 모든 태그의 목록을 얻으려면 어떻게해야합니까?

답변

1

찾기 호출에서 :joins을 옵션으로 사용할 수 있습니다. 예 :

Tag.find(:all, :select => 'distinct tags.*', :joins => :books) 

만 책 관련이 태그를 찾을 수와 :select => 'distinct tags.*'는 여러 책과 관련된 경우에만 한 번도 각 태그를 검색 보장합니다.

+0

감사합니다. : select => "distinct tags. *"가 트릭을했습니다. 약간의 수정 : Tag.find (: all, : select => '별개의 태그. *', : joins => : books) ... – auralbee

+0

죄송합니다. – Shadwell

1

일반적으로 다재다능하지 않은 구식 has_and_belongs_to_many보다 더 쉽게 가입 할 수 있습니다 (has_many ..., :through 가입 방법 사용).

이 구조 조정의 간단한 방법은 다음과 같습니다 당신이 적어도 한 권의 책이 태그 목록을 찾고 있다면

class Book < ActiveRecord:Base 
    has_many :book_tags 
    has_many :tags, :through => :book_tags 
end 

class Tag < ActiveRecord:Base 
    has_many :book_tags, 
    has_many :books, :through => :book_tags 
end 

class BookTag < ActiveRecord::Base 
    belongs_to :book 
    belongs_to :tag 
end 

, 당신은 BookTag 모델을 사용하여이를 검색 할 수 있습니다. 이 경우 가입 목록에서 고유 한 태그 집합을 찾고 있습니다.

SELECT DISTINCT tag_id FROM book_tags 

검색 통화로 쉽게 연결할 수 있습니다.

당신을 위해 이것을 처리하는 acts_as_taggable 유형 플러그인을 찾을 수 있습니다.