9

我有一个应用程序,我可以在其中列出项目并为每个项目添加标签。模型项目标签的关联如下:

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

所以,这种多对多的关系让我可以为每个Item设置n个标签,同一个标签可以多次使用。

我想列出按与此标签关联的项目数排序的所有标签。更多使用的标签,首先显示。少用,最后。

我怎样才能做到这一点?

问候。

4

2 回答 2

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

试试 desc, asc 看看有什么不同。

我们需要select,来拥有 tag_count 列,并且我们需要 tag_count 列来对其应用顺序,其余所有直接的joingrouping

顺便说一句,你为什么不试试这个https://github.com/mbleigh/acts-as-taggable-on

于 2012-06-09T04:14:43.157 回答
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"
于 2012-06-09T03:58:35.053 回答