首页 > 解决方案 > Ruby On Rails:如何在单个 SQL 查询中选择父模型的所有子模型以及这些子模型的 Active Storage 附件。活动记录

问题描述

我正在寻找可以为我执行此操作的单个 SQL 查询,这样我就不必对数据库执行如此多的请求。我想选择模型的所有子模型以及属于子模型的活动存储附件。

class Category < ApplicationRecord
  has_many :infographics, dependent: :destroy
  has_many :videos, dependent: :destroy
  has_many :pdfs, dependent: :destroy


private 

def create_resources
    sorted_resources = (self.pdfs.with_attached_document + self.videos +  self.infographics.with_attached_photo).sort_by(&:created_at).reverse
end

end

我想收集我的 Category 模型的所有 pdf、信息图表和视频子项。模型 PDF 和信息图表具有附加到它们的活动存储项目,因此我想在此查询中包含这些项目,这样我就不会提出太多请求。

有谁知道我如何在一个请求中写这个?

非常感谢你的帮助。

标签: sqlruby-on-railsactiverecordassociationsrails-activestorage

解决方案


您可以直接查询与您的类别相关的 ActiveStorage 附件。用一个查询做你想做的事情的一种方法可能是:

def create_resources
  sorted_resources = ActiveStorage::Attachment.
    where(record_type: class.name, record_id: id).
    order(created_at: :desc)
end

这样,您可以使用一个查询将它们全部排序。请注意,您在链中的最后一个方法将使用 ruby​​ 对它们进行排序。相反,通过使用 order 方法,您告诉 ActiveRecord 也将您的结果按顺序排列。


推荐阅读