优化预先加载

时间:2014-11-23 11:47:56

标签: ruby-on-rails rails-activerecord arel

我有一个Gallery has_many MediaItem个,has_one VideoPhoto

我目前正在使用以下查询:

MediaItem.includes(gallery: {media_items: [:photo, :video]}).featured.rank(:position_in_featured)

然而,鉴于媒体项目只会有VideoPhoto,我总是会留下一个未使用的急切负载,无论它没有。

是否有更有效的查询方式来避免这种不必要的包含?

注意:我不需要涉及多态关联的解决方案。在这种情况下,它们会给其他查询带来太多复杂性,并且不适合数据模型。

1 个答案:

答案 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_typeMediaItem个列。

编辑:文档中甚至还有一条说明,在本节的最后一段中,热切加载应该适用于您的情况:http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#module-ActiveRecord::Associations::ClassMethods-label-Eager+loading+of+associations