gpt4 book ai didi

ruby-on-rails - 急切加载 Paperclip 的 has_attached_file 数据?

转载 作者:行者123 更新时间:2023-12-04 03:51:24 26 4
gpt4 key购买 nike

产品 has_many :assets

Assets 属于:产品

Asset has_attached_file :photo 使用 Paperclip(带有所有标准 Paperclip 选项;一些样式,S3 存储)。

如果我形成一个类似p = Product.includes(:assets) 的产品查询,我可以调用 Assets 的每个实际属性,而不会引发任何额外的数据库查询,例如:

p = Product.includes(:assets)
p.each { |a| print a.assets.first.title }

Asset 上的 title 属性(这是一个数据库列)打印,没有查询。

获取 Paperclip 生成的 URL:

p = Product.includes(:assets)
p.each { |a| print a.assets.first.photo.url }

对每个 Product 进行单独的附加查询:

Product Load (0.3ms)  SELECT "products".* FROM "products" WHERE "products"."id" = 2 LIMIT 1

根据 this G.Groups posting ,我不应该在每次通过循环时访问数据库,但我是。

有没有办法避免每次迭代都产生额外的数据库命中,而是一次收集所有数据?我是否忽略了一些简单的事情?

Rails 3.0.9、REE 1.8.7、Paperclip 2.3.11。

已更新,修复

问题是在我的 Paperclip 设置中,我将 :product_id 作为 :path 的一部分: :attachment/:product_id/:filename-: style.:extension,这会导致循环中每次迭代的额外 Product 查询。

通过将查询更改为 p = Product.includes(:assets => [:product]).all,它删除了额外的查询。

最佳答案

如果您使用其中一个查询分析器插件试试查询审阅器,或者如果您使用的是 newrelic,开发模式包括这个,我们可以更快地找到问题的根源。您将获得每个查询的堆栈跟踪。我不认为它与预加载有任何关系——如果它与预加载有任何关系,您将获得额外的 Assets 加载而不是产品加载。

关于ruby-on-rails - 急切加载 Paperclip 的 has_attached_file 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6500124/

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