簡體   English   中英

如何創建與模型關聯的最常用標簽的列表?

[英]How do I create a list of the most used tags associated with a model?

我不太確定如何為這個問題加上標題,但是我將在這里解釋。 我在第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

在我的wine show.html.erb頁面上,我顯示了所有評論的列表,每個評論都顯示了它的標簽。 我正在嘗試計算每個標簽在評論中的使用次數,並根據所有評論顯示葡萄酒收到的前5個標簽的列表。 我該怎么做?

我可以在我的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_counts.each遍歷每個標簽。 然后,我每次迭代都會打印出標簽名稱和計數。

我沒有可用的測試數據來確認這項工作,但是我認為這是您想要的(為清晰起見而拆分):

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM