Acts-as-taggable-on按上下文查找所有标记

时间:2011-01-04 15:12:52

标签: sql ruby-on-rails ruby-on-rails-3 acts-as-taggable-on

所以在为我的rails应用程序搜索标记宝石之后,我找到了惊人的acts-as-taggable宝石。安装它并玩游戏我发现它将所有标签保存在标签db中,它只保存没有上下文的Tag.name,而是保存在:through relationship db(taggings)中。在大多数情况下,我可以看到这是完美的。除了我的应用程序,我希望能够为用户提供基于预先存在的标签进行标记的功能(例如,不允许他们创建自己的标签),acts-as-taggable无法搜索所有标签在内置的一个上下文中(例如,如果我要呈现标记db的自动完成,我将包含我的应用程序中的所有标记,这不是我想要的)

下面的方法就是我刚刚充实的内容,看看它是否会起作用(它确实如此),但我想知道我是否遗漏了acts-as-taggable的内容。我的意思是我看不到任何提供这种方法的地方?

<% ActsAsTaggableOn::Tagging.find_all_by_context("tags").each do |tagging| %>
  <%= tagging.tag %>
<% end %>

如果例如acts-as-taggable不这样做,这是最好的方法吗?感觉有点不高效,我会更好地进行自定义SQL查询而不是通过acts-as-taggable进行路由吗?

如果它对所有人都有帮助,那就是我的日志:

Started GET "/users" for 127.0.0.1 at 2011-01-04 14:46:20 +0000
Processing by UsersController#index as HTML
SQL (0.5ms)   SELECT name
FROM sqlite_master
WHERE type = 'table' AND NOT name = 'sqlite_sequence'
User Load (0.1ms)  SELECT "users".* FROM "users"
ActsAsTaggableOn::Tagging Load (0.5ms)  SELECT "taggings".* FROM "taggings" WHERE ("taggings"."context" = 'languages')
ActsAsTaggableOn::Tag Load (0.1ms)  SELECT "tags".* FROM "tags" WHERE ("tags"."id" = 2) LIMIT 1
Rendered users/index.html.erb within layouts/application (10.4ms)

2 个答案:

答案 0 :(得分:16)

您还可以使用如下语句:

# Returns all the tags for the specified model/context with a count >= 1
@tags = YourModel.tag_counts_on(**context**)

添加限制和订单:

# Get the top 5 tags by count
@tags = YourModel.tag_counts_on(**context**, :limit => 5, :order => "count desc")

使用从count

返回的代码的tag_counts_on属性访问计数
tag.count

答案 1 :(得分:0)

我相信有道路: User.tag_counts_on(:tags)

=> [#<ActsAsTaggableOn::Tag id: 1, name: "foo">,
#<ActsAsTaggableOn::Tag id: 2, name: "bar">,
#<ActsAsTaggableOn::Tag id: 3, name: "sushi">,
#<ActsAsTaggableOn::Tag id: 4, name: "pizza">]