acts-as-taggable-on - 如何通过父对象获取标签

发布于 2024-12-02 03:46:35 字数 133 浏览 1 评论 0原文

如果我有两个模型 Bucket 和 Photos。存储桶有很多照片并且照片属于一个存储桶。如果我然后使用acts-as-taggable-on gem 添加标签到照片。通过 Bucket 获取唯一标签列表的最佳方法是什么(惯用且性能良好)?还是单个桶?

If I have two models Buckets and Photos. Buckets has_many Photos and Photo belongs_to a Bucket. If I then added tagging to photos using the acts-as-taggable-on gem. What is the best way (idiomatic and performs well) to get a unique list of tags by Bucket? or for a single Bucket?

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

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

发布评论

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

评论(1

七颜 2024-12-09 03:46:35

像这样的东西应该满足您的要求

# in your bucket class
def tag_list
  photos.inject([]) do |tags, photo|
    # with inject syntax
    tags + photo.tags.map(&:name) # remove the maps call if you need tag objects
  end.uniq
end

def alternative_tag_list
  # this code is even simpler, return unique tags
  photos.map { |p| p.tags }.flatten.uniq
end

您应该对它们进行基准测试。它们应该在处理少量数据时表现良好,并且您始终可以对结果使用记忆或缓存。您可以通过使用 include() 获取存储桶对象(包括照片和标签)来减少所需的查询数量,如

@bucket = Bucket.includes(:photos).includes(:tags).find(params[:id])

如果基准不好,您应该使用 SQL,但是您将失去注入和插入的语法糖。公司

Something like this should meet your request

# in your bucket class
def tag_list
  photos.inject([]) do |tags, photo|
    # with inject syntax
    tags + photo.tags.map(&:name) # remove the maps call if you need tag objects
  end.uniq
end

def alternative_tag_list
  # this code is even simpler, return unique tags
  photos.map { |p| p.tags }.flatten.uniq
end

You should benchmark them. They should perform well with a few data and you can always use memoization or cache for the result. You can reduce the number of queries needed by fetching your bucket object including both photos and tags with includes() as in

@bucket = Bucket.includes(:photos).includes(:tags).find(params[:id])

If the benchmark is not good you should go with SQL, but then you're going to loose syntactic sugar of inject & co.

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