这是我的模型:

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"

在行而言返回:组=>:标识将返回相同的一组是:uniq的=>真实的,但它也可以让你完成你想要的计算。这种说法是不是劳动密集型的:uniq的=> true,所以我给它一个不同的名称,允许您选择是否与他们的分组计数获取独特的标签,或只是唯一的标签列表

上面的语句将频率属性添加到返回的记录。通过使用method_missing的魔力,你可以访问一个以@ tag.frequency。

用法:

@tags = @asset.tags_with_count
@tags.each{|tag| puts [tag.id, tag.name. tag.frequency].join "\t"}

将打印ID,名称和每个标签为@asset的出现次数。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top