Rails 标记:按出现次数查找标签

发布于 2024-11-30 23:29:40 字数 393 浏览 2 评论 0原文

我的应用程序中有一个相当简单的标记模型。

Photo has_many :taggings
Photo has_many :tags, :through => :taggings

Tag has_many :taggings
Tag has_many :photos, :through => :taggings

Tagging belongs_to :photo
Tagging belongs_to :tag

我现在想做的是检索所有标签,按照标有该特定标签的照片数量对它们进行排序,并在标签旁边显示该数字。

你如何编写这样的查询?而且,当您为每个标签显示 tag.photos.count 时,如何防止 n+1 查询?

谢谢!

I have a fairly simple tagging model in my app.

Photo has_many :taggings
Photo has_many :tags, :through => :taggings

Tag has_many :taggings
Tag has_many :photos, :through => :taggings

Tagging belongs_to :photo
Tagging belongs_to :tag

What I'd like to do now is retrieve all the tags, order them by the number of photos tagged with that particular tag, and show that number along side the tag.

How do you write a query like that? And, how do you prevent an n+1 query when you show tag.photos.count for each tag?

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

我很OK 2024-12-07 23:29:40

SQL 是你的朋友 - 假设 Tag 模型有一个 name 属性:

tags = Tag.joins(:photos).
           group("tags.id").
           select("tags.id, tags.name, count(*) as num_photos").
           order("num_photos")

tags.all.each do |tag|
  puts [tag.id, tag.name, tag.num_photos].join(",")
end

你可以将其放入范围内(例如 with_counts< /code>) 并执行以下操作:


 Tag.where(["tags.name = ?",sassy]).with_counts.first.num_photos

SQL is your friend - assuming the Tag model has a name attribute:

tags = Tag.joins(:photos).
           group("tags.id").
           select("tags.id, tags.name, count(*) as num_photos").
           order("num_photos")

tags.all.each do |tag|
  puts [tag.id, tag.name, tag.num_photos].join(",")
end

You could throw that in a scope (e.g., with_counts) and do things like:


 Tag.where(["tags.name = ?",sassy]).with_counts.first.num_photos

梅窗月明清似水 2024-12-07 23:29:40

这是一个 hack,但假设所有标签都是标签和照片之间的有效链接,您可以使用它

Tagging.group("tag_id").order("count(*) desc").count

来获取所有标签 id 的有序哈希以及与该标签关联的标签/照片的数量。

This is a hack, but assuming that all the Taggings are valid links between a tag and a photo you could use

Tagging.group("tag_id").order("count(*) desc").count

to get an ordered hash of all the Tag ids and the number of taggings/photos associated with that tag.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文