假设我有Book
,has_many
Photos
。当用户访问/books/1
时,我想在图库中显示每本图书的照片,但是在索引页面(/books
)上,我只想为每本图书显示一张照片。请注意,我在名为Photos
的{{1}}表中添加了一列,其中包含一个布尔值。
在一本书的50张照片中,只有1张是hero_image
。为了获得索引页面的所有英雄图像,简单地在hero_image
表上包含一个包含相同值Book
的列(hero_image
是不是更有效率})作为hero_image的image-url
?这样做可以为数据库保存额外的查询,该数据库将根据Photo
字段和正在显示的图书的Photos
查找hero_image
。
另一个重要的考虑因素是我经常通过rake任务更新每个id
,因此如果我要添加更新Photo
父after_update
的{{1}}回调(使用ActiveModel::Dirty)然后这也有点贵(有很多照片,每个都会触发上述回调)
答案 0 :(得分:1)
您可以定义一个简单的has_one
来定义相关principal_photo
中的photos
:
class Book < ActiveRecord::Base
has_many :photos
has_one :principal_photo, -> { where(principal: true) }, class_name: 'Photo'
渴望加载:
@books = Book.where(id: 1..999).includes(:principal_photo)
此代码允许您只加载最相关的图片,而不是photos
范围内的所有Book
。 这将只生成2个SQL请求,一个用于检索Book
个记录,另一个用于检索定义为Photo
的相关principal
记录。这将使您免于缓存数据的痛苦以及它背后的回调。