Rails 3按顺序排列has_many:通过

时间:2012-06-08 23:09:57

标签: ruby ruby-on-rails-3 activerecord tagging

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

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 标记,并且可以多次使用相同的标记。

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

我该怎么做?

问候。

2 个答案:

答案 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"