[英]How do I optimize a polymorphic news feed in 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)
問題是我不能急於加載對象模型,因為它是多態的我如何克服這個問題?
多態關聯支持急切加載。 您需要執行以下操作:
Activity.find(:all, :include => :objectable, :conditions => {:user_id => current_user.id})
雖然您需要確保已在關聯模型上正確定義了多態關系。
如需進一步幫助,請參閱: http : //api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#label-Eager+loading+of+associations
多態部分位於“Eager loading of Associations”部分的末尾。
正如@Wahaj所說,急切加載僅適用於:includes
而不是:join
。
以下是文檔的解釋:
Address.find(:all,:include =>:addressable)
這將執行一個查詢以加載地址並加載可尋址的每個可尋址類型一個查詢。 例如,如果所有可尋址者都是Person或Company類,那么將執行總共3個查詢。 要加載的可尋址類型列表是在加載的地址的背面確定的。 如果Active Record必須回退到先前的eager加載實現,並且將引發ActiveRecord :: EagerLoadPolymorphicError,則不支持此操作。 原因是父模型的類型是列值,因此其對應的表名不能放在該查詢的FROM / JOIN子句中。
我想這就是你所追求的:
current_user.activities.includes(:object)
正如文檔所說,每個關聯都會有一個額外的查詢。 我不確定,但您可能需要為rails指定另一個方向的關聯,以了解要搜索的AR模型,例如:
class Post < ActiveRecord::Base
has_many :activities, :as => :object
end
如果您仍然遇到錯誤,那么您可能會使用尚未實現此功能的早期rails版本。
它不可能對多態關系進行急切加載......但你可以為一個多態類型做這樣的事情,比如你有兩個polymorphic_type然后過濾那個類型的記錄,然后急切加載它會工作然后....完美的渴望加載,但部分渴望加載
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.