我有一个named_scope,它根据他们在特定时间段内所做的相关“grouptask”记录的数量返回一些用户(学生)记录。
学生模特:
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
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”并不能让我在那里,我猜是因为该列不会映射到实际的db列,因为它是在查找时构造的。那么如何在AR结果集中访问这些类型的东西呢?
此用例是一个包含学生姓名及其创建任务总量的表格。现在我通过查找在过去X天内创建任务的用户(通过在该时间段内找到total_tasks&gt; 0)然后执行for-each循环通过这些用户并计算数量来执行此操作那个时期的任务再次。这显然会导致很多SQL调用不需要这样做,因为这些调用已经计算好,以便首先找到帐户。
感谢您的帮助。
答案 0 :(得分:0)
我认为这是一个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
我还没有测试过,但它可能会给你一个想法。