2012-06-08 13 views
9

Mam aplikację, w której mogę wystawiać przedmioty i dodawać znaczniki do każdego przedmiotu. Modele przedmioty i Tagi wiążą się tak:Rails 3 Order By Count on has_many: through

class Item < ActiveRecord::Base 
    has_many :taggings 
    has_many :tags, :through => :taggings 
end 

class Tagging < ActiveRecord::Base 
    belongs_to :item 
    belongs_to :tag 
end 

class Tag < ActiveRecord::Base 
    has_many :taggings 
    has_many :items, :through => :taggings 
end 

Tak, to wiele-do-wielu pozwala mi ustawić n tagów dla każdej pozycji, a ten sam znacznik może być używany kilka razy.

Chciałbym wyświetlić wszystkie tagi uporządkowane według liczby elementów powiązanych z tym znacznikiem. Więcej używanych tagów, pokazuje pierwszy. Mniej używane, ostatnie.

Jak mogę to zrobić?

Pozdrawiam.

Odpowiedz

8
Tag.joins(:taggings).select('tags.*, count(tag_id) as "tag_count"').group(:tag_id).order(' tag_count desc') 

spróbować go desc, ASC i zobaczyć różnicę.

Musimy wybrać, aby mieć kolumnę tag_count i musimy tag_count kolumny zastosować zamówienie do niego, reszta wszystko proste dołączyć i grupowania.

Btw, dlaczego nie można tego wypróbować https://github.com/mbleigh/acts-as-taggable-on

+0

Dziękuję bardzo za pomoc. Spróbuję tej wtyczki. – goo

+0

+1 Amol. Czy masz pojęcie, jak osiągnąć ten sam wynik zapytania, ale z inną warstwą has_many through :? Moje pytanie [http://stackoverflow.com/questions/19537378/ordering-nested-has-many-rough-by-count-of-associations] będzie analogiczne do Elementów goo będących członkami Grup, a następnie próbujących wyświetlić Tagi pojedynczej Grupy Przedmiotów według ich częstotliwości użycia w Grupie, a nie wśród wszystkich Przedmiotów. Dzięki! –

3

Można mieć nadzieję, że jest lepszy sposób, ale to działało dla mnie (bez białych znaków). Załóżmy, że name jest atrybutem nazwy modelu Tag.

foo = Tagging.select("name, count(item_id) as item_count") 
     .joins("inner join tags on taggings.tag_id = tags.id") 
     .group("name") 
     .order("item_count DESC") 

foo.each { |r| puts "number of items tagged #{r.name}: #{r.item_count}"} 

-->"number of items tagged Bieber: 100" 
-->"number of items tagged GofT: 99" 
Powiązane problemy