2011-08-23 2 views
0

내 앱에는 상당히 간단한 태깅 모델이 있습니다. 내가 지금하고 싶은 무엇레일 태깅 : 출현 횟수로 태그 찾기

Photo has_many :taggings 
Photo has_many :tags, :through => :taggings 

Tag has_many :taggings 
Tag has_many :photos, :through => :taggings 

Tagging belongs_to :photo 
Tagging belongs_to :tag 

는 모든 태그를 검색 특정 태그가 사진의 숫자로 그들을 주문하고, 측면을 따라 그 수에게 태그가 표시됩니다.

어떻게 그런 쿼리를 작성합니까? 그리고 각 태그에 tag.photos.count을 표시 할 때 n + 1 쿼리를 어떻게 방지합니까?

감사합니다.

답변

2

SQL은 당신의 친구합니다 - Tag 모델을 가정하는 것은 name 속성이 있습니다

tags = Tag.joins(:photos). 
      group("tags.id"). 
      select("tags.id, tags.name, count(*) as num_photos"). 
      order("num_photos") 

tags.all.each do |tag| 
    puts [tag.id, tag.name, tag.num_photos].join(",") 
end 

당신은 (예를 들어, with_counts) 범위에 그것을 던져 같은 것들을 할 수있는 :


Tag.where(["tags.name = ?",sassy]).with_counts.first.num_photos 

+0

'join (: photos)'을 지정할 때 레일즈가'taggings'를 통해 자동으로 조인을 구성합니까? – Andrew

+0

나는 그것을 확신하지만, 쉽게 찾을 수있는 방법이 있습니다. – klochner

+0

이것은 아름답게 작동합니다, 감사합니다! – Andrew

0

이를 해킹이지만 모든 태그가 태그와 사진 사이의 유효한 링크라고 가정하면

Tagging.group("tag_id").order("count(*) desc").count 

모든 태그 ID의 정렬 된 해시 및 해당 태그와 관련된 태그 지정/사진 수를 가져옵니다.