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

したがって、この多対多の関係により、各アイテムに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 を試して違いを確認してください。

tag_count 列を持つにはselectが必要です。また、それに順序を適用するには tag_count 列が必要です。残りはすべて単純な結合グループ化です。

ところで、これを試してみませんかhttps://github.com/mbleigh/acts-as-taggable-on

于 2012-06-09T04:14:43.157 に答える
3

より良い方法があることを願っていますが、これは私にとってはうまくいきました(空白なしで)。nameタグモデルの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 に答える