产品 has_many :资产
资产 belongs_to :产品
资产 has_attached_file :photo
使用 Paperclip(包含所有标准的 Paperclip 选项;一些样式、S3 存储)。
如果我形成一个 Product 查询,例如 p = Product.includes(:assets)
,我可以调用 Asset 的实际属性而不会产生额外的数据库查询,例如:
p = Product.includes(:assets)
p.each { |a| print a.assets.first.title }
< p > Asset 上的 title 属性(数据库列)会直接输出,不进行任何查询。
< p > 要获取 Paperclip 生成的 URL:
p = Product.includes(:assets)
p.each { |a| print a.assets.first.photo.url }
会为每个产品
引起一个单独的额外查询:
Product Load (0.3ms) SELECT "products".* FROM "products" WHERE "products"."id" = 2 LIMIT 1
根据这篇G.Groups帖子,我不应该在每次循环中访问数据库,但实际上却是这样的。有没有办法避免每次迭代时都要进行额外的数据库查询,而是一次性收集所有数据?我是否忽略了一些简单的东西?
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
,可以消除额外的查询。