ruby-on-rails - 如何在 Rails 中使用 gem 'acts-as-taggable-on' 时获取所有标签的列表(不是计数)

标签 ruby-on-rails ruby ruby-on-rails-4 acts-as-taggable-on

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

 acts_as_taggable_on :deshanatags

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

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

我该怎么做?

我尝试遵循许多教程,但遇到了死胡同,因为它们中的大多数都是为 Rails 3 编写的。Rails 对模型进行了一些更改,例如删除了 attr_accessor,这让我很难理解这些教程。所以请帮忙。

只是我正在尝试将 Jquery token 输入 ( http://loopj.com/jquery-tokeninput/) 添加到我的应用中

PS:通过Tagging table,有没有办法像Tag.all的输出一样通过过滤上下文得到一个标签列表?

最佳答案

标签存储在标签表中,您可以从您的程序访问该表,例如

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

让我们解释一下这个声明中的各个部分:

  • 'includes' 确保不同的标签是“急切加载”的,换句话说,不是加载 n+1 条记录,而是只对数据库进行 2 次查询
  • 'where' 将记录限制为具有给定上下文的记录
  • 'map' 将生成的记录数组转换为一个新数组,其中包含您在问题中要求的哈希值,id 映射到标签的 id,name 映射到标签的名称
  • 最后,'uniq' 确保您的列表中没有 double

为了解决您的其他问题,即没有标签的标签,您可以将 where 子句扩展为

where("(context = 'deshanatags') AND (tag_id IS NOT NULL)")

关于ruby-on-rails - 如何在 Rails 中使用 gem 'acts-as-taggable-on' 时获取所有标签的列表(不是计数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22710243/

相关文章:

ruby-on-rails - Rails 4 has_one 关联表单未构建

Ruby-on-Rails:如何摆脱 "you are being redirected"页面

initialize() 中的 Ruby proc 与 lambda

ruby - 如何在 Ruby Net::HTTP 中实现 cookie

ruby-on-rails - 如何将 CanCanCan 与枚举字段一起使用?

Jquery移动: Binding on "change" not excuted after redirect (rails 4)

ruby-on-rails - 如何在 Rails 3.2 中使用 JBuilder 渲染 json

ruby-on-rails - Rspec rails : Testing if layout includes styles or javascripts

ruby-on-rails - Rails 3 - 生产模式下的开发错误

ruby - 如何断开现有的 ruby​​ 续集与数据库的连接?