2011-10-24 104 views
0

我有一个named_scope,它根据他们在特定时间段内做出的相关“grouptask”记录数返回一些用户(学生)记录。从AR范围结果中返回计算出的SQL列

学生模型:

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”没有让我在那里,我猜,因为该列没有映射到实际的数据库列,因为它是在查找时构造的。那么,如何在AR结果集中访问这些类型的东西呢?

这个用例是一个包含学生姓名和创建任务总数的表格。现在我通过查找在过去X天内创建任务的用户(通过在该时间段内查找total_tasks> 0)然后执行for-每个仅循环这些用户并计算再次在这段时间内完成任务。这显然导致大量的SQL调用不应该完成,因为这些总数已经计算出来以便首先查找帐户。

感谢您的任何帮助。

+0

你能提供你的模型和关联设置吗?这个范围在哪里定义? – moritz

+0

为了清晰起见进行了编辑。 – John

回答

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 

我还没有测试过,但它可能会给你一个想法。