代码之家  ›  专栏  ›  技术社区  ›  jefflunt

在我从gem得到的模型上运行SQL

  •  0
  • jefflunt  · 技术社区  · 16 年前

    所以,我正在做一个项目,使用acts作为类固醇宝石的标签。我把它安装成了一块宝石,它的效果非常好。这里是我遇到问题的地方-我想生成一个前25个使用过的标记的列表,以及它们在所有可标记项中使用的次数。

    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
    .....
    

    所以,我想建立一个视图来列出这些信息,但它不合作。我没有“taggings”表的相关模型,假设有一个,我想这可能是因为我将acts_as_taggable_作为gem而不是插件安装在了_steroids上?

    例如,我尝试在我的应用程序中执行此操作:

    @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::Taggings”错误

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

    作为后续问题,我想我可以创建自己的“标记”模型和控制器,这很有意义。然而,如果我这样做,我会与类固醇宝石上的任何行为相冲突吗?如果不是,我想这可能是最简单/更好的方法!

    2 回复  |  直到 16 年前
        1
  •  0
  •   aw crud    16 年前

    @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")
    
        2
  •  0
  •   jefflunt    16 年前

    解决了的!感谢这篇关于使用Rails+遗留数据库的文章,这里: http://sl33p3r.free.fr/tutorials/rails/legacy/legacy_databases.html

    通过将预先存在的表视为“遗留”数据库的一部分(即使技术上不是),simple创建了一个名为“TaggingSearch”的新模型。。。

    class TaggingSearch < ActiveRecord::Base
    
      set_table_name "taggings"
    
    end
    

    …通过使用“set_table_name”方法,我能够将这个新模型连接到现有表,并像在任何其他ActiveRecord上一样执行“find_by_sql”方法。

    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
    

    现在我只需要 真正地 小心不要在“taggings”表中添加任何破坏性操作,因为它由“acts_as_taggable_on_steroids”插件拥有和维护。只要我只做“SELECT”语句,我就可以了。