我在模型中设置了acts-as-taggable-on
gem,如下所示:
acts_as_taggable_on :deshanatags
它使用上下文deshanatags
。现在我需要获取所有标签的列表(不仅仅是分配给一个项目的标签。我需要以下格式的所有内容):
[
{"id":"856","name":"House"},
{"id":"1035","name":"Desperate Housewives"}
]
我该怎么做呢?
我尝试了很多教程,但都走进了死胡同,因为大多数教程都是为Rails3编写的。Rails对模型进行了一些更改,比如删除了attr_accessor,这使得我很难理解这些教程。所以请帮帮忙。
我只是尝试将Jquery Token input (http://loopj.com/jquery-tokeninput/)添加到我的应用程序中
PS :通过标签表,有没有办法通过过滤上下文来获得像Tag.all输出的标签列表?
发布于 2014-03-28 18:45:34
标签存储在标签表中,您可以使用例如
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
让我们解释一下这条语句中的各个部分:
包含‘
‘
<代码>F212
为了解决没有标记的标记的附加问题,您可以将where子句扩展为
where("(context = 'deshanatags') AND (tag_id IS NOT NULL)")
发布于 2014-08-12 17:46:49
我个人认为,如果你有许多标签需要检索,那么这两种解决方案都会很慢,因为有很多单一的select语句。我会这样做:
ActsAsTaggableOn::Tagging.includes(:tag).where(context: 'deshanatags').uniq.pluck(:id, :name)
如果你在ruby 1.9+上
这样一来,你最终会得到:
SELECT DISTINCT "taggings"."id", name FROM "taggings" LEFT OUTER JOIN "tags" ON "tags"."id" = "taggings"."tag_id" WHERE "taggings"."context" = 'deshanatags'
快速简单的imo
发布于 2014-04-01 16:21:34
使用ActsAsTaggableOn::Tagging
模型,您可以获得所有标签的列表,并根据上下文对其进行筛选,然后按如下方式格式化它们:
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以阐明每个语句的作用,并更新了最终结果的格式以使用字符串作为键而不是符号
https://stackoverflow.com/questions/22710243
复制相似问题