ruby-on-rails - 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
方法期间已经存在(或者可能是其他更合适的查询)?
有任何想法吗?
解决方案
tags
假设您有一个包含enumerble
of Tag
s的变量(如 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})
位的更多信息。
推荐阅读
- docker - 如何使用 docker 在 jvm 中设置时区
- bash - 使用 sed 清理文件以获取环境配置
- python-3.x - 如何让不和谐机器人使用 discord.py 触发它自己的消息上的命令?
- node.js - 有没有办法我可以跟踪模型中更改的时间和实体
- javascript - 将字符串转换为 DOM 后,对象作为 React 子项无效
- c - 无法完成写入 EEPROM,因为它会重置电路板
- javascript - 将 JQuery 函数从 keyup 更改为提交
- aws-lambda - 我可以在 AWS Cognito 中为 sign_in 和 sign_up 过程设置不同的回调 URL 吗?
- javascript - 使用 setTimeout() 进行优化
- typescript - 禁止字符串类型索引签名的数字属性