如何计算使用acts_as_taggable标记标记的项目数

时间:2014-04-25 18:22:13

标签: mysql ruby-on-rails acts-as-taggable-on

在我的应用程序中,我有一个Factoids,每个都标记有不同的标签。我正在尝试创建一个列出所有标签的索引页面,并显示使用该标签标记了多少Factoids。我已经弄清楚如何生成标签列表但无法弄清楚如何计算。

我有三个Factoids,每个都用括号中的项目标记:

  • Factoid One(“红色”,“蓝色”)
  • Factoid Two(“Red”,“Green”)
  • Factoid Three(“红色”,“蓝色”,“粉红色”)

我要做的是打印一张表格,显示以下内容......

  • 红色:3
  • 蓝色:2
  • 绿色:1
  • 粉红色:1

我在视图中有这个给我标签的名称,但我不知道如何计算它们的出现次数。

<% @tags.each do |tag| %>
   <%= link_to tag.name, tag_path(tag.name) %>
<% end %>

我还设法编写了一个MySQL查询来实现它......

SELECT tags.name, count(tags.id) AS count
FROM `tags`
LEFT OUTER JOIN taggings ON taggings.tag_id = tags.id
GROUP BY tags.id;

如何在RoR中执行此查询?

这是我的DB Schema

ActiveRecord::Schema.define(:version => 20140423203020) do

  create_table "factoids", :force => true do |t|
    t.string   "title"
    t.text     "description"
    t.string   "name"
    t.datetime "created_at",  :null => false
    t.datetime "updated_at",  :null => false
  end

  create_table "taggings", :force => true do |t|
    t.integer  "tag_id"
    t.integer  "taggable_id"
    t.string   "taggable_type"
    t.integer  "tagger_id"
    t.string   "tagger_type"
    t.string   "context",       :limit => 128
    t.datetime "created_at"
  end

  create_table "tags", :force => true do |t|
    t.string "name"
  end

  # Foreign Keys and indexes for taggings
   add_index("taggings", ["tag_id"], :name => "index_taggings_on_tag_id")
   add_index("taggings", ["taggable_id", "taggable_type", "context"], :name => "index_taggings_on_taggable_id_and_taggable_type_and_context")

end

1 个答案:

答案 0 :(得分:1)

想出办法。

<% Factoid.tag_counts.each do |tag| %>
   <tr>
      <td><%= link_to tag.name, tag_path(tag.name) %></td>
      <td><%= tag.count %></td>
   </tr>
<% end %>