我应该在子关联和父级中保留一个值以避免额外的查询吗?

时间:2017-09-03 20:08:11

标签: ruby-on-rails activerecord

假设我有Bookhas_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,因此如果我要添加更新Photoafter_update的{​​{1}}回调(使用ActiveModel::Dirty)然后这也有点贵(有很多照片,每个都会触发上述回调)

1 个答案:

答案 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记录。这将使您免于缓存数据的痛苦以及它背后的回调。