2011-10-24 9 views
0

私は特定の期間に行った関連する「grouptask」レコードの数に基づいてユーザ(学生)レコードを返すnamed_scopeを持っています。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"を実行しても私の所には届かないのですが、その列はルックアップ時に構築されているため実際のdb列にはマップされないためです。だから、どのようにAR結果セットでこれらの種類のものにアクセスするのですか?

このユースケースは、生徒の名前と作成されたタスクの合計数を含む表です。今私は、過去のX日数(その期間にtotal_tasks> 0を見つけて)でタスクを作成したユーザーを見つけて、それらのユーザーをループさせるfor-eachを実行し、その期間のタスクを再度実行します。明らかに、最初にアカウントを見つけるために合計が計算されているので、実行する必要のない多くのSQL呼び出しが発生します。

ありがとうございました。

+0

モデルとアソシエーションの設定を指定できますか?このスコープはどこに定義されていますか? – moritz

+0

明瞭にするために編集されています。 – John

答えて

0

これはレール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 

これはまだテストされていませんが、あなたには分かりません。

関連する問題