2011-08-23 85 views
4

我使用Rails 3和SQLite,我試圖做一個活動記錄查詢並同時使用來自另一個模型的信息排序結果。我有一個資源模型(屬於用戶)和一個shared_items模型來處理用戶彼此共享資源。我想創建一個用戶創建並與他們共享的所有資源的源。與工作查詢的資源模型:通過模型關聯排序的活動記錄查詢:Rails 3和SQLite

class Resource < ActiveRecord::Base 
    has_many :shared_items, :dependent => :destroy 

    default_scope :order => 'resources.shared_items.created_at DESC' 
    scope :from_users_sharing_with, lambda { |user| shared_with(user) } 

    private 

    def self.shared_with(user) 

    resource_ids = %(SELECT resource_id FROM shared_items WHERE shared_with_id = :user_id) 
    where("id IN (#{resource_ids}) OR user_id = :user_id", 
     { :user_id => user }) 
end 

此查詢創建已共享或創建的用戶的所有資源的一個很好的「喂」陣列,但它們是由資源下令創建日期,而非創作相應的shared_item的日期,這正是我期待做的。我如何在數據庫級別編寫排序?我認爲我可以在Ruby中進行排序(就像Ian建議的here),但由於我一次只想分頁讀取25條記錄,所以我不認爲我可以採用該選項。 任何想法讚賞。

+0

我沒有測試過,但下面應該工作:'Resource.includes(:shared_item)。凡( 「?shared_items.shared_with_id = OR USER_ID =」,user.id,user.id).order( 「shared_items.created_at DESC」)' – rubish

+0

感謝您的迴應。這個查詢將被放置而不是私有的'shared_with(user)'方法嗎?我把它放在那裏,我得到了異常 - 列名不明確:user_id:SELECT DISTINCT「resources」.id FROM「resources」LEFT OUTER JOIN「shared_items」ON「shared_items」。「」resource_id「=」resources「。」id「 WHERE(shared_items.shared_with_id = 1或user_id = 1)ORDER BY shared_items.created_at DESC LIMIT 30 OFFSET 0 – technix

+0

將'user_id'更改爲'resources.user_id'以避免錯誤。 – rubish

回答

3
class Resource < ActiveRecord::Base 
    has_many :shared_items, :dependent => :destroy 

    scope :from_users_sharing_with, lambda { |user| 
    includes(:shared_item). 
     where("shared_items.shared_with_id = ? OR resources.user_id = ?", user.id, user.id). 
     order("shared_items.created_at DESC") 
    # might need to add `select("DISTINCT resources.*")` at the end 
    } 
end 
+0

這工作得很好。只需將include(:shared_item)更改爲(:shared_items)即可。使用來自例外情況的術語/單詞,我發現有關'急切加載關聯'的信息,我假設這個查詢正在執行什麼?謝謝您的幫助。 – technix

+0

@technix基本上,我是這樣寫的,以便在您的範圍內將兩個查詢減少到一個,以便您可以對相關模型進行排序。急切加載是一種副作用,只有在您爲此範圍返回的資源使用共享項時纔會有所幫助。您可能會注意到,如果您在最後添加'select(DISTINCT resources。*)',您將失去急切的加載優勢。 – rubish

相關問題