Запуск SQL на модели, которую я получил от драгоценного камня - PullRequest
0 голосов
/ 23 февраля 2010

Итак, я работаю над проектом, в котором используется гем act_as_taggable_on_steroids. Я установил его как драгоценный камень, и он прекрасно работает и все. Вот где я сталкиваюсь с проблемами - я хочу сгенерировать список из 25 лучших используемых тегов и количество раз, которое они использовались во всех тегируемых элементах.

Ну, как это происходит, acts_as_taggable_on_steroids, создает таблицу под названием "taggings", которая содержит эту информацию. Когда я запускаю следующую команду 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
.....

Итак, я хочу создать представление для перечисления этой информации, и она не сотрудничает. У меня нет связанной модели для таблицы «тегов», если она есть, и я думаю, что это может быть связано с тем, что я установил activ_as_taggable_on_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"

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

В качестве дополнительного вопроса, я полагаю, я мог бы создать свою собственную модель и контроллер "Taggings", что имело бы смысл. Однако, если я сделаю это, столкнусь ли я с чем-либо в самоцвете act_as_taggable_on_steroids? Если нет, то я думаю, что в любом случае это может быть простой / лучший способ сделать это!

Ответы [ 2 ]

0 голосов
/ 24 февраля 2010

РЕШИТЬ! благодаря этому посту о работе с базами данных Rails + Legacy, здесь: 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

Теперь я просто должен быть действительно осторожным, чтобы не добавлять никаких деструктивных действий в эту таблицу "taggings", поскольку она принадлежит и поддерживается плагином Act_as_taggable_on_steroids. Пока я делаю только операторы SELECT, у меня все будет хорошо.

Это было интересно!

0 голосов
/ 23 февраля 2010

Одна вещь, которую я вижу, это отсутствие пробела между вашим окончательным 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...