2010-02-23 46 views
0

因此,我正在開發一個使用acts_as_taggable_on_steroids gem的項目。我已經將它安裝爲一個寶石,它運行得非常好。這裏是我遇到問題的地方 - 我想要生成25個使用過的標籤的列表,以及它們在所有可標記項目中使用的次數。在我從寶石那裏獲得的模型上運行SQL

好吧,碰巧,acts_as_taggable_on_steroids創建了一個名爲「標記」的表格,其中包含此信息。當我運行對直接DB下面的SQL命令

SELECT tags.name as tag_name, COUNT(*) as num_uses 
FROM taggings 
JOIN tags ON tags.id = taggings.tag_id 
GROUP BY tag_id 
ORDER BY num_uses DESC, tags.name 
LIMIT 25; 

我得到下面的示例中的結果,符合市場預期,排序由最常用的降序排列,並按照字母順序再分分類:

==================================== 
tag_name   | num_uses 
==================================== 
gadgets    15 
cars     12 
programming   12 
quirky    12 
2009     7 
..... 
...etc., etc., up to 25 rows 
..... 

所以,我想建立一個視圖列出這個信息,而不是合作。我沒有「標記」表的關聯模型,假設有一個,我想這可能是因爲我將acts_as_taggable_on_steroids安裝爲gem而不是插件?

例如,我想在我的應用程序這樣做:

@top_taggings = Taggings.find_by_sql("SELECT tags.name as tag_name, COUNT(*) as num_uses " + 
            "FROM taggings " + 
            "JOIN tags ON tags.id = taggings.tag_id " + 
            "GROUP BY tag_id " + 
            "ORDER BY num_uses DESC, tags.name" + 
            "LIMIT 25") 

...我得到一個 「未初始化的常量ListingsController ::引用的Tagging」 錯誤

======== ====================

作爲一個後續問題,我想我可以創建自己的「標籤」模型和控制器,這是有道理的。但是,如果我這樣做,我會與acts_as_taggable_on_steroids gem中的任何內容發生衝突嗎?如果沒有,我想這可能只是簡單/更好的方法來做到這一點!

回答

0

解決了!由於這個職位上使用Rails的工作+遺留的數據庫,在這裏: http://sl33p3r.free.fr/tutorials/rails/legacy/legacy_databases.html

通過預先存在的表的思想爲「傳統」數據庫(即使在技術上它不是)的一部分,簡單的創建了一個名爲新模式「TaggingSearch」 ......

class TaggingSearch < ActiveRecord::Base 

    set_table_name "taggings" 

end 

...,通過使用「set_table_name」的方法,我能夠將這種新的模式連接到現有的表,並執行「的find_by_sql」方法,我將在任何其他ActiveRecord。

附帶的控制器很簡單:

class TaggingSearchController < ApplicationController 

    def top_25_tags 
    @taggings = TaggingSearch.find_by_sql("SELECT tags.name as tag_name, COUNT(*) as num_uses " + 
              "FROM taggings " + 
              "JOIN tags ON tags.id = taggings.tag_id " + 
              "GROUP BY tag_id " + 
              "ORDER BY num_uses DESC, tags.name " + 
              "LIMIT 25") 

    respond_to do |format| 
     format.html # show.html.erb 
     format.xml { render :xml => @listing } 
    end 
    end 

end 

現在我只是要真的小心,不要被「acts_as_taggable_on_steroids」任何破壞性動作添加到「引用的Tagging」表,因爲它擁有和維護插入。只要我只做「SELECT」語句,我應該沒問題。

這是一個有趣的!

0

我看到的一件事是你的最終ORDER BY和你的LIMIT之間沒有空格。在按順序放置tags.name後面放一個空格,然後查看它的作用。

@top_taggings = Taggings.find_by_sql("SELECT tags.name as tag_name, COUNT(*) as num_uses " + 
            "FROM taggings " + 
            "JOIN tags ON tags.id = taggings.tag_id " + 
            "GROUP BY tag_id " + 
            "ORDER BY num_uses DESC, tags.name " + 
            "LIMIT 25") 
+0

哦,很好。我添加了空間,但不幸的是,我有相同的錯誤信息。 :(沒有症狀改變 – jefflunt 2010-02-23 20:19:32

+0

除此之外 - 這是來自某人對RoR很少和非常老的經驗 - 錯誤信息似乎是將Taggings識別爲一個常量(可能會降低這一點,因爲沒有任何內容可用的命名空間稱爲Taggings)。您是否包含/ require/import /無論Ruby的術語是「Taggings」類? – 2010-02-23 20:41:11