列出与模型间接相关的 ActiveStorage 附件

List ActiveStorage attachments indirectly related to model

我是 Rails 的新手,正在尝试了解 ActiveStorage 的工作原理。

该应用有以下型号:

class Client < ApplicationRecord
    has_many :jobs
    has_many :messages
end
class Job < ApplicationRecord
    belongs_to :client
    has_many_attached :images
end
class Message < ApplicationRecord
    belongs_to :client
    has_many_attached :images
end

在数据库中我可以看到多态关系,我也可以理解什么 SQL 查询会得到我想要的结果。

但是我想知道是否有一种惯用且有效的方法来检索与客户端相关的所有附件?

有一种方法,但您必须以客户为目标,然后询问他们的消息,遍历每条消息以询问他们的附件。它应该看起来像这样:

#ask for first client and all messages
oneClient = Client.first
allImages = []
oneClient.message.all.each do |msg|
  #ask for the all images of each message
  msg.image.all.each do |img|
    img << allImages
  end
end
#repeat block for Job
oneClient.job.all.each do |jb|
  jb.image.all.each do |img|
    img << allImages
  end
end

上面的块应该为您提供一个客户与其所有消息及其所有消息图像的关系。

查询与给定记录关联的附件

您可以直接使用ActiveStorage::Attachment class查询附件。 record 属性是连接到附加的 class 的多态关联。

举个例子

ActiveStorage::Attachment.where(record: Job.first)

查询与一组记录关联的附件

您还可以将一组记录传递给 record 选项

ActiveStorage::Attachment.where(record: Job.all)

查询与多组记录关联的附件

您可以使用 or

查找与多组记录关联的附件
ActiveStorage::Attachment.where(record: Job.all).or(ActiveStorage::Attachment.where(record: Message.all))

放在一起...

查找与给定记录关联的多组记录关联的所有附件

client = Client.first
ActiveStorage::Attachment.where(record: client.jobs).or(ActiveStorage::Attachment.where(record: client.messages))

虽然不漂亮,但很有效率。所有查询都是通过 Active Record 完成的,这意味着它发生在单个 SQL 语句中,不需要将任何对象加载到内存中。