我已经设置了acts-as-taggable-on
我的模型中的宝石是这样的:
acts_as_taggable_on :deshanatags
它使用上下文deshanatags
。现在我需要获取此上下文中所有标签的列表(不仅仅是分配给一项的标签。我需要所有内容),格式如下:
[
{"id":"856","name":"House"},
{"id":"1035","name":"Desperate Housewives"}
]
我怎样才能做到这一点?
我尝试遵循许多教程,但遇到了死胡同,因为它们大多数都是为 Rails 3 编写的。Rails 对模型进行了一些更改,例如删除 attr_accessor,这使我很难理解这些教程。所以请帮忙。
只是我试图添加 Jquery 令牌输入(http://loopj.com/jquery-tokeninput/ 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,名称映射到标签的名称
- 最后,“uniq”确保您的列表中没有双打
为了解决您的额外问题,即没有标签的标记,您可以将 where 子句扩展到
where("(context = 'deshanatags') AND (tag_id IS NOT NULL)")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)