2011-12-27 21 views
3

這裏是我的模型:如何在rails中優化多態新聞提要?

class User < ActiveRecord::Base 
    has_many :activities 
    has_many :requests 

class Activity < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :object, :polymorphic => true 

我想所有的用戶活動,並顯示它們

Activity.where(:user_id => current_user.id).include(:object) 

的問題是,我可以不急於負載對象模型,因爲它是多態 如何我能克服這個問題嗎?

+0

我可以使用包含一個類似的多態關聯(Rails 3.1)。當你嘗試時會發生什麼? – 2012-01-06 12:17:18

+0

另外要注意的一點是:如果你在Rails控制檯上測試這個來查看生成的sql(得出它不是急切的加載),那麼確保你在where子句或你的select子句中使用該對象的屬性。Rails可能不會作爲查詢的優化加載(當不需要時,至少我認爲它是一種優化)。 – jake 2012-01-06 22:29:30

回答

-1

它不可能有渴望加載到多態關係......但你可以做一個多態類型,就像你有兩個polymorphic_type然後過濾該類型的記錄然後使其急切加載它然後將工作。 ...不是完美的渴望加載,但部分渴望加載

2

正如@Wahaj所說,急切的加載僅適用於:includes而不是:join

下面是來自文檔的解釋:

Address.find(:所有,:包括=>:尋址)

這將執行一個查詢來加載地址和與一個加載addressables每個可尋址類型的查詢。例如,如果所有的地址都是Person或Company類,那麼總共會執行3個查詢。要加載的可尋址類型的列表在加載的地址的背面確定。如果Active Record必須回退到之前的加載實現並且會引發ActiveRecord :: EagerLoadPolymorphicError,則不支持此操作。原因是父模型的類型是一個列值,因此其相應的表名不能放在該查詢的FROM/JOIN子句中。

我覺得這是你追求的:

current_user.activities.includes(:object) 

由於文檔說,會有每個關聯一個額外的查詢。我不知道,但你可能需要定義一個協會向另一個方向導軌知道要搜索的AR模型,例如:

class Post < ActiveRecord::Base 
    has_many :activities, :as => :object 
end 

如果你仍然得到一個錯誤,你可能會在一個早期的rails版本還沒有實現這一點。