Ruby on rails 如何创建与模型关联的最常用标记的列表?

Ruby on rails 如何创建与模型关联的最常用标记的列表?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我不太确定如何命名这个问题,但我会在这里解释。我在rails 4上,我正在尝试构建一个葡萄酒评论应用程序。我有一个葡萄酒模型和一个相关的评论模型 wine.rb has_many :reviews review.rb belongs_to :wine has_many :taggings has_many :tags, through: :taggings def self.tag_counts Tag.select("tags.*, count(taggings.tag_id) a

我不太确定如何命名这个问题,但我会在这里解释。我在rails 4上,我正在尝试构建一个葡萄酒评论应用程序。我有一个葡萄酒模型和一个相关的评论模型

wine.rb

has_many :reviews
review.rb

belongs_to :wine
has_many :taggings
has_many :tags, through: :taggings
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
我的评论中有一些标签是通过一个单独的模型“tagging.rb”创建的

tag.rb

has_many :taggings
has_many :reviews, through: :taggings
tagging.rb

belongs_to :review
belongs_to :tag
在我的wine
show.html.erb
页面上,我显示了所有评论的列表,每个评论都显示了它被标记的内容。我试图计算每个标签在评论中使用的次数,并根据所有评论显示葡萄酒收到的前5个标签的列表。我该怎么做

我可以在my review.rb中获得应用程序范围内使用的前5个标签的列表

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\u计数。每个
迭代每个标记。然后每次迭代我都会让它打印出标签名和计数。

我没有现成的测试数据来确认这一点,但我认为这是您想要的(为了易读性拆分):

编辑

对不起,我误解了这个问题。我认为这应该满足您的要求(尽管我还没有测试):


这是工作!谢谢这显示了特定葡萄酒上最常用的五个标签。我如何显示它们被使用的时间?谢谢,在看了你的编辑后,我拼凑了一些东西,并提出了一个解决方案。我在问题中把它添加到了更新中。再次感谢,现在我需要学习它,这样我才能理解发生了什么:P
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)