This is my model:
class Tag < ActiveRecord::Base # id, name has_many :taggings end class Tagging < ActiveRecord::Base # id, tag_id, owner_id, target_type, target_id belongs_to :tag belongs_to :owner, :class_name => 'User' belongs_to :target, :polymorphic => true validates_uniqueness_of :tag_id, :scope => [ :target_id, :target_type, :owner_id ] end class Asset < ActiveRecord::Base # id, owner_id, title, type, etc belongs_to :owner, :class_name => 'User' has_many :taggings, :as => :target has_many :taggers, :through => :taggings, :source => :owner, :uniq => true has_many :tags, :through => :taggings, :uniq => true end class User < ActiveRecord::Base # id, name, email, etc has_many :assets, :foreign_key => 'owner_id' has_many :my_taggings, :class_name => 'Tagging', :foreign_key => 'owner_id' has_many :my_tags, :through => :my_taggings, :source => :tag, :uniq => true has_many :taggings, :as => :target has_many :taggers, :through => :taggings, :source => :owner, :uniq => true has_many :tags, :through => :taggings, :uniq => true end
All relationships work, but I have an additional requirement that I cannot find a solution for:
consider this relation in the Asset class
has_many :tags, :through => :taggings, :uniq => true
calling Asset.find (: first) .tags returns an array of tags as expected, but I need each tag to contain a count attribute, indicating how many times the line would appear if: uniq => true is not specified.
eg. more than one user can apply the same tag to an object. I would like to show the name of the tag plus the number of users who used it.