2010-07-23 101 views
4

我有一個多態關聯像這樣 -查詢多態關聯

class Image < ActiveRecord::Base 
    has_one :approval, :as => :approvable 
end 

class Page < ActiveRecord::Base 
    has_one :approval, :as => :approvable 
end 

class Site < ActiveRecord::Base 
    has_one :approval, :as => :approvable 
end 

class Approval < ActiveRecord::Base 
    belongs_to :approvable, :polymorphic => true 
end 

我需要找到approval.apporvable.deleted = false

我已經試過這樣的事情的批准 -

@approvals = Approval.find(:all, 
    :include => [:approvable], 
    :conditions => [":approvable.deleted = ?", false ]) 

這使得「不能急於加載多態關聯:可認可的「錯誤

如何正確地給出條件,以便獲得可批准項目未被刪除的批准結果集?

感謝所有幫助提前

+0

代替N + 1,這可能是與4個散裝查詢,一個用於每個關聯類加在所有關聯的初始準備掃描來完成。準備數據結構可以是將每個關聯類映射到[source_id,association_id]的哈希。 – mahemoff 2015-04-21 09:01:07

回答

3

這是不可能的,因爲所有的「可批准項」駐留在不同的表。相反,您必須獲取所有批准,然後使用普通的數組方法。

@approvals = Approval.all.select { |approval| !approval.approvable.deleted? } 
3

您對SQL的要求是從結果集中不同行的不同表投影數據。這是不可能的,我的知識。

所以你必須安於:

@approvals = Approval.all.reject{|a| a.approvable.deleted? } 
# I assume you have a deleted? method in all the approvables 
1

我會建議,要麼已經在這裏給出的答案(他們是同樣的事情),但我也建議把被刪除的標誌進入審批模型,如果你真的很關心在單個查詢中完成這一切。

有了多態關係,rails可以使用在polys上的提前獲取,但不能加入到它們中,因爲關係並不知道,所以查詢實際上是多個查詢相交的。

因此,最終如果您真的需要,可以在單個查詢中將所有可能的聯接放入sql並將所有可能的聯接交叉到所有類型的可批准類型,但是您必須手動進行大量聯接。 (手動的意思是不使用導軌的內置機制...)

0

感謝您的回答 我非常確定,這是無法完成的。我希望更多的確認 除了我希望其他soln通過結果集 ,以避免後來的性能相關的問題 雖然暫時拒絕/選擇都很好,但從長遠來看,我 將不得不手動執行這些sql連接。 再次感謝您的幫助!

中號