首页 > 解决方案 > Ruby on Rails - 可能在 .map() 方法中急切加载?

问题描述

是否可以将预先加载用作 .map() 方法的一部分?

例如,我有以下内容:

tag_images = tags.map(&:images)

在其他地方,每个 tag_images 都有它的 parent_image 访问image.parent_image

子弹宝石建议我使用.includes(:parent_image),但我不确定如何在这种情况下应用急切加载。

以下是如何设置模型的适用部分...

图片.rb

has_many :image_tags
has_many :tags, through: :image_tags

has_many :crops, class_name: "Image", foreign_key: "parent_image_id"
belongs_to :parent_image, class_name: "Image"

标签.rb

has_many :image_tags
has_many :images, through: :image_tags

正在发生的事情是它正在处理一系列一个或多个标签并“收集”与它们相关的所有图像(因此使用tags.map(&:images))。稍后,parent_image这些图像中的每一个都用 引用image.parent_image

所以理想情况下,虽然它正在“收集” tag_images,有没有一种方法可以“获取”关联的 parent_images,而它在初始.map方法期间已经存在(或者可能是其他更合适的查询)?

有任何想法吗?

标签: ruby-on-railseager-loading

解决方案


tags假设您有一个包含enumerbleof Tags的变量(如 an ActiveRecord_Relation),我认为您可能想要更多类似的东西:

tag_images = Image.joins(:tags).where(tags: {id: tags}).distinct.includes(:parent_image)

你可能需要也可能不需要.distinct- 你只需要弄乱它就可以看到。

顺便说一句,您可以查看Joined Tables 文档中的指定条件以了解有关该.joins(:tags).where(tags: {id: tags})位的更多信息。


推荐阅读