Это - моя модель:
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
Все отношения работают, но у меня есть дополнительное требование, чтобы я не мог найти решение для:
рассмотрите это отношение в Классе активов
has_many :tags, :through => :taggings, :uniq => true
вызов Asset.find (: сначала), .tags возвращает массив Тегов как ожидалось, но мне нужно, чтобы каждый Тег содержал атрибут количества, указывающий, сколько раз строка появилась бы если: uniq => верный не был указан.
например, больше чем один Пользователь мог применить тот же Тег к Активу. Я хотел бы отобразить имя тега плюс число пользователей, которые применили его.
Это должно делать именно то, что вы хотите.
has_many :tags_with_count, :source => :tag, :through => :taggings,
:group => "tags.id", :joins => :taggings,
:select = "tags.*, COUNT('taggings.id') AS frequency"
В терминах строк, возвращаемых :group => :id вернет то же самое множество, что и :uniq => true, но это также позволит вам выполнять нужные вам вычисления. Это утверждение более трудоемкое, чем :uniq => true, поэтому я дал ему другое имя, позволяющее выбирать, извлекать ли уникальные теги с их группировкой или просто список уникальных тегов.
Вышеприведенное утверждение добавит атрибут частоты к возвращаемым записям. С помощью магии метода_пропустить, вы можете получить доступ к нему с помощью @tag.frequency.
Использование:
@tags = @asset.tags_with_count
@tags.each{|tag| puts [tag.id, tag.name. tag.frequency].join "\t"}
Выведет идентификатор, имя и количество вхождений каждого тега для @asset.