我有一个Gallery
has_many
MediaItem
个,has_one
Video
或Photo
。
我目前正在使用以下查询:
MediaItem.includes(gallery: {media_items: [:photo, :video]}).featured.rank(:position_in_featured)
然而,鉴于媒体项目只会有Video
或Photo
,我总是会留下一个未使用的急切负载,无论它没有。
是否有更有效的查询方式来避免这种不必要的包含?
注意:我不需要涉及多态关联的解决方案。在这种情况下,它们会给其他查询带来太多复杂性,并且不适合数据模型。
答案 0 :(得分:1)
执行此操作的最佳方法可能是将您的数据模型更改为polymorphic关系并使用belongs_to
中的MediaItem
关联
class MediaItem < ActiveRecord::Base
belongs_to :media_content, :polymorphic => true
end
class Photo < ActiveRecord::Base
has_many :media_items, :as => :media_content
end
class Video < ActiveRecord::Base
has_many :media_items, :as => :media_content
end
MediaItem.includes(gallery: {media_items: [:media_content]}).featured.rank(:position_in_featured)
为此,您需要在media_content_id
上添加media_content_type
和MediaItem
个列。
编辑:文档中甚至还有一条说明,在本节的最后一段中,热切加载应该适用于您的情况:http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#module-ActiveRecord::Associations::ClassMethods-label-Eager+loading+of+associations