我不太确定如何标题这个问题,但我会在这里解释一下。我在轨道4上,我正在尝试建立一个葡萄酒评论应用程序。我有一个葡萄酒模型和一个相关的评论模型..
wine.rb
has_many :reviews
review.rb
belongs_to :wine
has_many :taggings
has_many :tags, through: :taggings
我的评论包含通过has_many
has_many
关系与单独模型“tagging.rb”建立的标签
tag.rb
has_many :taggings
has_many :reviews, through: :taggings
tagging.rb
belongs_to :review
belongs_to :tag
在我的葡萄酒show.html.erb
页面上,我会显示所有评论的列表,每条评论都会显示已标记的内容。我试图计算每个标签在评论中使用的次数,并根据所有评论显示葡萄酒收到的前5个标签的列表。我该怎么做?
我可以在我的评论中获取前5个使用过的广告代码列表.rb
def self.tag_counts
Tag.select("tags.*, count(taggings.tag_id) as count").
joins(:taggings).group("taggings.tag_id").order("count DESC").limit(5)
end
但我希望能够获得特定葡萄酒上使用的前5名。感谢。
更新
感谢@kardeiz帮助我,虽然这个:)。 我最终使用它来获得我正在寻找的结果
Tag.joins(:reviews => :wine).where("wines.id = ?", self.id).group("taggings.tag_id").select("wines.id, tags.*, COUNT(taggings.tag_id) as count").order('count DESC').limit(5)
然后在我看来我有@wine.tag_counts.each
遍历每个标记。然后我每次迭代都会打印出标签名称和计数。
答案 0 :(得分:1)
我没有随时可用的测试数据来确认这是有效的,但我认为这是你想要的(拆分易读性):
Tag
.joins(:reviews => :wine)
.where('wines.id = ?', whatever_id)
.group("taggings.tag_id")
.order("COUNT(taggings.tag_id) DESC")
.limit(5)
修改强>
抱歉,我误解了这个问题。我认为这应该做你想要的(尽管我还没有测试过):
in_sql = Tag
.joins(:reviews => :wine)
.group("taggings.tag_id")
.select("wines.id as wid, tags.*, COUNT(taggings.tag_id) as count")
.to_sql
out_sql = %Q{
select *
from (#{in_sql})
where wid = #{whatever_id}
order by count
limit 5
}
ActiveRecord::Base.connection.execute(out_sql)