2012-03-06 39 views
0

我有一個複雜的SQL查詢涉及3個模型,創建基於時間操作的虛擬屬性...理想情況下,我想要使用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.idusers.id AS id暴露以及users.username

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") 
相關問題