gpt4 book ai didi

ruby-on-rails - Rails - 检测到急切加载

转载 作者:行者123 更新时间:2023-12-05 06:31:59 25 4
gpt4 key购买 nike

我有 3 个关联表:ElmentMeasurementImage

元素 has_many 测量

测量has_many图像,也是图像has_many测量(N-N关联)


如何最大限度地减少查询数量

images = @element.measurements.map {|e| e.images}.reject!(&:blank?)
images.flatten.map {|i| i.file.url}

对于此代码,每个测量都有 N 个查询。我可以用这样的东西来最小化它吗:

@element.measurements.joins(:images).select('images.file')

查询:`

SELECT "images.file" FROM "measurements" 
INNER JOIN "images" ON "element_images"."measurement_id" = "measurements"."id"
INNER JOIN "images" ON "element_images"."id" = "images"."image_id"
WHERE "measurements"."element_id" = $1`

最佳答案

这里是逐步替换:

images = @element.measurements.map {|e| e.images}.reject!(&:blank?)

这行代码最好产生下一个关系

has_many :images, through: :measurements
# OR for better naming
has_many :measurement_images, through: :measurements, source: :images

然后你可以这样做:

images = @element.measurement_images

执行下一条SQL

SELECT * 
FROM images
INNER JOIN measurements
ON measurements.id = images.measurement_id
WHERE measurements.element_id = $1

因此无需将空白图像拒绝为 INNER JOIN就是这样做,扔掉不匹配的记录,查看the doc

创建此 has_many through 后关系,下一段代码不会产生任何 N+1 问题:

images.map {|i| i.file.url}

您还可以通过添加 #select 来最小化输出,但我不建议您这样做,因为它会使代码复杂化很多,并且与图像库实现紧密耦合,因此在更新库的情况下,您可能会破坏代码。但请注意,如果您使用 paperclip使用默认 URL 生成模式的 gem 你可以这样做:

image_ulrs = @element
.measurement_images
.select(
:id,
:type, # if you have STI model
:<your_file_field>_file_name,
:<your_file_field>_updated_at
).map { |i| i.file.url }

<your_file_field> 是传递给 has_attached_file 的第一个参数例如

has_attached_file :attachment

会导致

  ...  
.select(
:id,
:type, # if you have STI model
:attachment_file_name,
:attachment_updated_at
)

但我再次建议这样做,因为它不会带来很多性能改进,但将来可能会让人头疼。

关于ruby-on-rails - Rails - 检测到急切加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51613295/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com