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

Cel*_*lso 3 ruby-on-rails rails-activestorage

我是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
Run Code Online (Sandbox Code Playgroud)

在数据库中,我可以看到多态关系,还可以了解哪种SQL查询可以为我带来所需的结果。

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

Car*_*III 5

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

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

这是一个例子

ActiveStorage::Attachment.where(record: Job.first)
Run Code Online (Sandbox Code Playgroud)

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

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

ActiveStorage::Attachment.where(record: Job.all)
Run Code Online (Sandbox Code Playgroud)

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

您可以使用以下命令找到与多组记录关联的附件 or

ActiveStorage::Attachment.where(record: Job.all).or(ActiveStorage::Attachment.where(record: Message.all))
Run Code Online (Sandbox Code Playgroud)

把它放在一起...

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

client = Client.first
ActiveStorage::Attachment.where(record: client.jobs).or(ActiveStorage::Attachment.where(record: client.messages))
Run Code Online (Sandbox Code Playgroud)

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