2012-04-20 32 views
0

我在這裏搜索了很多,但無法找到類似的主題:我需要在Arel中編寫查詢,因爲我使用will_paginate來瀏覽結果,所以我在使用原始SQL執行時會失去很多的安慰。加入在Arel中分組的子查詢?

這裏就是我需要阿雷爾拼寫:

SELECT m.* 
FROM messages m 
JOIN (SELECT tmp.original_id as original_id, 
       max(tmp.id) as id 
     FROM messages tmp 
     WHERE tmp.recipient_id = ? 
     GROUP BY tmp.original_id) g ON (m.id = g.id) 
ORDER BY m.updated_at DESC; 

解釋簡單的字:子查詢檢索的所有郵件的用戶。如果消息具有較新的回覆(在回覆中我將引用消息ID保存爲original_id),較舊的回覆將被忽略。對於所有這些消息的結果,我希望Rails爲我提供相關對象。

我在SQL方面非常熟練,但不幸與Arel沒有關係。任何幫助將不勝感激。

回答

0

這樣的事情呢?

class Message < ActiveRecord::Base 
    scope :newer_messages lambda { |num_days=10| where("updated_at > #{Time.now} - #{num_days}.days") } 
end 

然後,您可以像這樣的給定用戶發現新的消息:

Message.find_by_user_id(user_id).newer_messages 
+0

有趣的想法。儘管這可能會起作用,但我出於性能原因選擇了另一個選項,並讓數據庫通過觸發器功能預先計算最新的答覆。謝謝你的努力。 – 2012-04-21 14:19:54

+0

當您像這樣鏈接調用時,只有一個選擇查詢發佈到數據庫。 (因爲它們在一個範圍內執行)。您可以從服務器日誌中觀察到這一點。我只是提到這一點,以防萬一您正在考慮發出多個選擇查詢。 – Salil 2012-04-22 15:19:38