Sitemde kullanıcı besleme için bazı N + 1 sorgularını kaldırmaya çalışıyorum. Bir FeedItem modeliKoşullu olarak istekli yükleme polimorfik dernekler
class Event < ActiveRecord::Base
has_many :feed_items, as: :feedable
end
class Tournament < ActiveRecord::Base
has_many :feed_items, as: :feedable
end
class FeedItem < ActiveRecord::Base
belongs_to :feedable, :polymorphic => true
end
Bir kullanıcı modeli de dahil olduğu bir polimorfik ilişki var çeşitli modelleri vardır nerede bir kullanıcı has_many Turnuvalar ve her iki farklı özelliklere sahip Olaylar. Bir kullanıcı için FeedItems'i yüklerken, koşullu olarak hangi FeedItem türüne bağlı olarak iç içe öznitelik yüklerim?
I (squeel DSL ile birlikte) ne anlama geldiğini bir örnek:
FeedItem.where{ (feedable_id.in(@user.tournaments.ids}) & feedable_type.eq('Tournament')) |
(feedable_id.in(@user.events.ids) & feedable_type.eq('Event')) }.includes(:feedable => :game)
Bu sorgu Turnuva modelin 'oyun' özelliğini yüklenirken istekli iken tipi Tournament'a Olay tüm FeedItems almaya çalışır. Turnuvalar için iyi çalışır, ancak FeedItems'i tekrarlarken olaylar bu özelliğin bulunmadığı bir hatayı atar.
Geçerli kesmek, her FeedItem türü için ayrı ayrı sorgular yapmak ve kayıtları birlikte eklemektir. Ancak bu, ilişkilendirmeyi yapmak istemediğim bir diziye dönüştürür.
Herhangi bir fikrin var mı?
Hala ayrı sorgularınızı yapabilir, ancak herhangi bir şey yüklemek yerine her birinden FeedItem kimliklerini ekleyebilirsiniz. Topladığınız tüm kimliklerin bir dizisini oluşturun ve bunu istekli olduğunuz tek sorgunuza aktarın. – Humza