我有一个应用程序,我可以列出项目并为每个项目添加标签。 模型项和标记的关联方式如下:
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 标记,并且可以多次使用相同的标记。
我想列出按此标记关联的项目数排序的所有标记。更多使用的标签,首先显示。较少使用,最后。
我该怎么做?
问候。
答案 0 :(得分:8)
Tag.joins(:taggings).select('tags.*, count(tag_id) as "tag_count"').group(:tag_id).order(' tag_count desc')
试试它,asc,看看差异。
我们需要选择,要有tag_count列,我们需要使用tag_count列将订单应用到它,所有直接 join 和分组
是的,为什么不试试这个https://github.com/mbleigh/acts-as-taggable-on答案 1 :(得分:3)
你希望有更好的方法,但这对我有用(没有空白)。假设name
是Tag模型的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"