仅加载关联对象的一部分

时间:2018-04-06 07:10:50

标签: ruby-on-rails ruby orm associations

我的RequestAttachment

有一个课程ProjectRequestsArchive
class ProjectRequestsArchive < ApplicationRecord
  has_one :request_attachment, 
           foreign_key: "request_id", 
           primary_key: "request_id", 
           required: true
end


class RequestAttachment < ApplicationRecord
    belongs_to :project_requests_archive,
               foreign_key: :request_id,
               primary_key: :request_id
end

班级RequestAttachment包含BLOB属性。

所以当我调用ProjectRequestsArchive.find(1054).request_attachment时,它会生成类似

的SQL
 RequestAttachment Load (24.7ms)  SELECT  `request_attachments`.* 
                                  FROM `request_attachments` 
                                  WHERE  `request_id` = 634 LIMIT 1

注意:此操作大约需要10秒,但我在request_id上设置了索引,所以现在最多需要1秒,这也很可怕。

问题:

我的问题是,我是否可以仅加载ID请求,而无需加载整个BLOB?我不需要将其加载到内存中,我只想加载ID

正如我可以看到上面的SQL输出,有select request_attachments.*

当我使用ProjectRequestsArchive.find(1054).request_attachment.id时,它还会创建SQL:select *

我想获取SQL查询,它只选择ID:SELECT id from request_attachmens。有什么办法吗?我无法通过某种懒惰的负载或类似的东西来解决它。

修改

我忘了提及,ProjectRequestArchive.request_id已映射到RequestAttachmet.request_id

RequestAttachment.idRequestAttachment.request_id不同。 我需要提取ID

3 个答案:

答案 0 :(得分:1)

它应该是开箱即用的延迟。如果您只想要ID,请检查ProjectRequestsArchive.first.request_id,并在首次触摸后加载ProjectRequestsArchive.first.request_attachment

答案 1 :(得分:1)

尝试此查询:

RequestAttachmet.joins(:project_requests_archive).where(
  project_requests_archives: { id: 1054 }
).pluck(:id)

答案 2 :(得分:0)

如果希望sql选择数据库中的特定列,可以使用select(*fields)

像这样使用:

Model.select("id, col1, col2").find() // and so on

现在查询日志应该是这样的:

SELECT id, col1, col2 FROM "models" ...

希望这有帮助!