2012-06-08 23 views
9

Tôi có một ứng dụng mà tôi có thể liệt kê các mục và thêm các thẻ vào mỗi mục. Các mô hình ItemsThẻ có liên quan như thế này:Rails 3 Order By Count on has_many: thông qua

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 

Vì vậy, đây nhiều-nhiều mối quan hệ cho phép tôi để thiết lập n thẻ cho mỗi Item và thẻ tương tự có thể được sử dụng vài lần.

Tôi muốn liệt kê tất cả các thẻ được sắp xếp theo số lượng mục được liên kết với thẻ này. Các thẻ được sử dụng nhiều hơn, hiển thị trước tiên. Ít được sử dụng, cuối cùng.

Tôi có thể làm như thế nào?

Trân trọng.

Trả lời

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

thử nó desc, asc và thấy sự khác biệt.

Chúng ta cần chọn, có cột tag_count, và chúng ta cần cột tag_count để áp dụng trật tự với nó, nghỉ ngơi tất cả thẳng về phía trước tham gianhóm.

Btw, tại sao bạn không dùng thử này https://github.com/mbleigh/acts-as-taggable-on

+0

Cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn. Và tôi sẽ thử plugin đó. – goo

+0

+1 Amol. Bạn có bất kỳ ý tưởng về làm thế nào để thực hiện kết quả truy vấn tương tự này nhưng với một lớp has_many thông qua :? Câu hỏi của tôi [http://stackoverflow.com/questions/19537378/ordering-nested-has-many-through-by-count-of-associations] sẽ tương tự với các mục của goo là thành viên của Groups, sau đó cố gắng liệt kê các Thẻ của một nhóm các mục riêng lẻ theo thứ tự tần suất sử dụng của chúng trong nhóm, chứ không phải trong số tất cả các mục. Cảm ơn! –

3

Bạn hy vọng có cách nào tốt hơn, nhưng điều này làm việc cho tôi (không có khoảng trắng). Giả sử name là thuộc tính tên của mô hình Thẻ.

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"