我是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查询可以为我带来所需的结果。
但是我想知道是否有一种惯用而有效的方法来检索与客户相关的所有附件?
答案 0 :(得分:3)
您可以直接使用ActiveStorage::Attachment
类查询附件。 record
属性是连接到附加类的多态关联。
这是一个例子
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语句中进行,不需要将任何对象加载到内存中。
答案 1 :(得分:0)
有一种方法,但是您必须以客户为目标,然后询问他们的消息,遍历每条消息以询问他们的附件。它应该看起来像这样:
array(3) {
[0]=>
string(23) "1991-1999 Jeep Cherokee"
[1]=>
string(23) "1991-1992 Jeep Comanche"
[2]=>
string(23) "1991-1999 Jeep Wrangler"
}
上面的方框应为您提供一个客户与其所有消息和所有消息图像的关系。