Возвращение вычисленного столбца SQL из результата области AR - PullRequest
0 голосов
/ 24 октября 2011

У меня есть named_scope, который возвращает некоторые записи пользователя (студента) на основе количества связанных записей «групповой задачи», которые они сделали за определенный период времени.

Модель студента:

class Student < ActiveRecord::Base
  set_table_name "student"
  set_primary_key :sid

  has_many      :usersessions, :foreign_key => "associatedstudentsid"
  has_many      :grouptasks, :through => :usersessions

  named_scope :used_in_past, lambda {|days_ago| {
   :conditions => ['(SELECT count(*) as total_tasks FROM grouptask WHERE creatorstudentid = sid AND creationdate > ?) > 0', Date.today-days_ago] 
  }}
end
*Модель 1005 * Grouptask:
class Grouptask < ActiveRecord::Base
  set_table_name "grouptask"

  has_many      :usersessions, :foreign_key => "associatedgrouptaskid"
  has_many      :students, :through => :usersessions
end

Я хочу получить доступ к этому столбцу «total_tasks» на лету из результата для каждой записи, но просто выполнить «student.total_tasks»я понял, потому что этот столбец не отображается на фактический столбец БД, так как он создан во время поиска.Итак, как можно получить доступ к таким вещам в наборе результатов AR?

Вариант использования для этого - таблица с именами учащихся и их общим количеством созданных заданий.Прямо сейчас я делаю это, находя пользователей, которые создали задачи за последние X дней (путем нахождения total_tasks> 0 за этот период времени), а затем делаю для каждого, который просто проходит по этим пользователям и подсчитывает количествозадачи в этот период времени снова.Это, очевидно, приводит к большому количеству вызовов SQL, которые не нужно выполнять, так как эти итоги уже были рассчитаны, чтобы найти учетные записи.

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 25 октября 2011

Я предполагаю, что это проект rails 2.Так что вы могли бы не просто

class Students < ActiveRecord::Base
  ...
  named_scope :with_task_counts, lambda { |days_ago| {
    :joins => :grouptasks,
    :select => "SELECT student.*, count(grouptasks.id) as c",
    :having => "c > 0"
  }}
  ...
end

Я еще не проверял это, но это может дать вам представление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...