2011-10-24 34 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 

我還沒有測試過,但它可能會給你一個想法。