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

时间:2018-09-10 13:11:05

标签: 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

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

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

2 个答案:

答案 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"
}

上面的方框应为您提供一个客户与其所有消息和所有消息图像的关系。