首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Rails中使用gem‘acts as-taggable-on’时获得所有标签的列表(而不是计数)

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

Stack Overflow用户
提问于 2014-03-28 18:30:19
回答 4查看 9.5K关注 0票数 21

我在模型中设置了acts-as-taggable-on gem,如下所示:

代码语言:javascript
复制
 acts_as_taggable_on :deshanatags

它使用上下文deshanatags。现在我需要获取所有标签的列表(不仅仅是分配给一个项目的标签。我需要以下格式的所有内容):

代码语言:javascript
复制
[
    {"id":"856","name":"House"},
    {"id":"1035","name":"Desperate Housewives"}
]

我该怎么做呢?

我尝试了很多教程,但都走进了死胡同,因为大多数教程都是为Rails3编写的。Rails对模型进行了一些更改,比如删除了attr_accessor,这使得我很难理解这些教程。所以请帮帮忙。

我只是尝试将Jquery Token input (http://loopj.com/jquery-tokeninput/)添加到我的应用程序中

PS :通过标签表,有没有办法通过过滤上下文来获得像Tag.all输出的标签列表?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-03-28 18:45:34

标签存储在标签表中,您可以使用例如

代码语言:javascript
复制
ActsAsTaggableOn::Tag.all

如果您需要有关标签用法的更多信息,也可以查看该表

代码语言:javascript
复制
ActsAsTaggableOn::Tagging

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

要进一步将其应用于您的示例,您可以使用

代码语言:javascript
复制
ActsAsTaggableOn::Tagging.includes(:tag).where(context: 'deshanatags').map { |tagging| { 'id' => tagging.tag_id.to_s, 'name' => tagging.tag.name } }.uniq

让我们解释一下这条语句中的各个部分:

包含‘

  • ’确保不同的标记是“立即加载”的,换句话说,不是加载n+1记录,而是只在数据库上执行两个查询

  • 将记录限制为具有给定上下文的记录

  • ’将生成的记录数组转换为一个新数组,其中包含您在问题中要求的散列,id映射到标记的id,名称映射到标记的名称

  • 最后,'uniq‘确保您的列表中没有重复项

<代码>F212

为了解决没有标记的标记的附加问题,您可以将where子句扩展为

代码语言:javascript
复制
where("(context = 'deshanatags') AND (tag_id IS NOT NULL)")
票数 44
EN

Stack Overflow用户

发布于 2014-08-12 17:46:49

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

代码语言:javascript
复制
ActsAsTaggableOn::Tagging.includes(:tag).where(context: 'deshanatags').uniq.pluck(:id, :name)

如果你在ruby 1.9+上

这样一来,你最终会得到:

代码语言:javascript
复制
SELECT DISTINCT "taggings"."id", name FROM "taggings" LEFT OUTER JOIN "tags" ON "tags"."id" = "taggings"."tag_id" WHERE "taggings"."context" = 'deshanatags'

快速简单的imo

票数 5
EN

Stack Overflow用户

发布于 2014-04-01 16:21:34

使用ActsAsTaggableOn::Tagging模型,您可以获得所有标签的列表,并根据上下文对其进行筛选,然后按如下方式格式化它们:

代码语言:javascript
复制
ActsAsTaggableOn::Tagging.all
.where(context: "deshanatags")
.map {|tagging| { "id" => "#{tagging.tag.id}", "name" => tagging.tag.name } }

where将为我们提供给定上下文的所有标记的结果,然后我们使用map遍历该结果,检索结果中每个标记的相关标记,并获得id和name属性。

如果您不使用ruby 1.9+,请确保直接链接这些方法(而不是跨几行

然后,您可以对结果调用.to_json,以获得可以使用的格式正确的json对象

编辑:

我更新了post以阐明每个语句的作用,并更新了最终结果的格式以使用字符串作为键而不是符号

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22710243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档