2012-03-06 15 views
0

私は3つのモデルを含む複雑なSQLクエリを持っており、時間操作に基づいて仮想属性を作成しています...理想的には、これを生成するためにActiveRecord arelメソッドを使用したいと思います。この複雑なクエリをActiveRecordで動作させるにはどうすればよいですか?

find_by_sql <<--sql 
    SELECT username, count(*) as records, AVG(time_taken) as time_taken 
    FROM (
     SELECT TIMESTAMPDIFF(HOUR, posts.created_at, reports.created_at) as time_taken, 
      users.username as username 
     FROM reports, users, posts 
     WHERE reports.user_id = users.id AND 
      reports.post_id = posts.id 
    ) AS dashboard_data # this name is unused, but apparently required 
    GROUP BY username 
    sql 

ActiveRecordでこれを行う方法はありますか?または、生のSQLは、このような複雑な作業を行う唯一の方法ですか?

答えて

0

テーブルから来ていない限り、あなたはこのようなことをしているつもりです。 ActiveRecordが意図している範囲外のサブクエリからフェッチしています。 ORMは、オブジェクトを明確に定義された表の特定の行にマップするように設計されています。

あなたがしていることは、SQLビューを使って十分にテーブルに似ているように見せかけることがあります。 ActiveRecordはテーブルのように照会することができれば喜んでビューを使用します。たとえば、ある種の主キーとして機能するように定義されたid列がある場合、それは機能するはずです。あなたの場合はGROUP BY users.idになり、と同様にusers.id AS idが公開されています。

0

私は、これはあなたがやっていることと等価であると思う:

User.joins({:reports=>:posts}). 
    group("users.username"). 
    select("users.username, 
      count(*) as records, 
      avg(timestampdiff(hour, posts.created_at, reports.created_at)) as time_taken") 
関連する問題