2012-06-08 14 views
9

मेरे पास एक ऐसा एप्लिकेशन है जहां मैं आइटम सूचीबद्ध कर सकता हूं और प्रत्येक आइटम में टैग जोड़ सकता हूं। मॉडल आइटम और टैग इस तरह जुड़े रहे हैं:रेल 3 आदेश हैस_मनी पर गिनती द्वारा:

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 

तो, यह कई-से-अनेक संबंध मुझे प्रत्येक आइटम के लिए n टैग सेट करने की अनुमति देता है, और एक ही टैग इस्तेमाल किया जा सकता बहुत बार।

मैं सभी टैग इस टैग के साथ जुड़े मदों की संख्या द्वारा आदेश दिया सूची करना चाहते हैं। अधिक इस्तेमाल किए गए टैग, पहले दिखाता है। कम इस्तेमाल किया, आखिरी।

मैं यह कैसे कर सकता हूं?

सम्मान।

उत्तर

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

यह desc, एएससी कोशिश करते हैं और अंतर देखते हैं।

हम चयन , tag_count स्तंभ की आवश्यकता है, और हम tag_count स्तंभ की जरूरत आदेश इसे करने के लिए, आराम सब सीधे आगे में शामिल होने और समूहीकरण लागू करने के लिए।

Btw, क्यों आप इस बाहर की कोशिश न https://github.com/mbleigh/acts-as-taggable-on

+0

आप आपकी मदद के लिए बहुत बहुत धन्यवाद। और मैं उस प्लगइन को आजमाउंगा। – goo

+0

+1 अमोल। आप कैसे यह एक ही क्वेरी परिणाम हासिल करने के लिए, लेकिन के माध्यम से has_many की एक और परत के साथ किसी भी विचार है :? मेरा सवाल [http://stackoverflow.com/questions/19537378/ordering-nested-has-any-through-by-count-of-associations] गुओ के आइटम समूह के सदस्य होने के समान होंगे, फिर टैग्स को सूचीबद्ध करने का प्रयास करेंगे सभी वस्तुओं के बजाय समूह के भीतर उपयोग की आवृत्ति के क्रम में आइटम के व्यक्तिगत समूह का। धन्यवाद! –

3

आपको उम्मीद है कि एक बेहतर तरीका है, लेकिन यह मेरे लिए (व्हाइटस्पेस के बिना) काम करता है। मान लें name टैग मॉडल का नाम विशेषता है।

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" 
संबंधित मुद्दे