如何在Rails中使用gem‘act-as taggable-on’时获得所有标记的列表(而不是计数)?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

我已经设置了acts-as-taggable-on在我的模型中是这样的:

 acts_as_taggable_on :deshanatags

它使用上下文deshanatags。现在,我需要得到所有标签的列表(不仅仅是为一个项目分配的标记)。(我需要以下格式的这种情况下的一切:

[
    {"id":"856","name":"House"},
    {"id":"1035","name":"Desperate Housewives"}
]

我该怎么做?

提问于
用户回答回答于

这些标签存储在标签表中,你可以从程序中访问该表。

ActsAsTaggableOn::Tag.all

如果你需要更多关于标签使用情况的信息,也有以下表

ActsAsTaggableOn::Tagging

它包含指向每个标记的使用位置的链接,包括其上下文。

要进一步将此应用于示例,可以使用

ActsAsTaggableOn::Tagging.includes(:tag).where(context: 'deshanatags').map { |tagging| { 'id' => tagging.tag_id.to_s, 'name' => tagging.tag.name } }.uniq

为了处理附加的问题,即没有标记的标签,可以将WHERE子句扩展到

where("(context = 'deshanatags') AND (tag_id IS NOT NULL)")
用户回答回答于

我个人认为,如果有许多标记要检索,那么这两种解决方案都会很慢,因为有许多单个SELECT语句。我会这样做:

ActsAsTaggableOn::Tagging.includes(:tag).where(context: 'deshanatags').uniq.pluck(:id, :name)

如果你在ruby1.9+

这样你就会有:

SELECT DISTINCT "taggings"."id", name FROM "taggings" LEFT OUTER JOIN "tags" ON "tags"."id" = "taggings"."tag_id" WHERE "taggings"."context" = 'deshanatags'

扫码关注云+社区