我在我的模型中设置了 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/