我的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
时,它会生成类似
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.id
与RequestAttachment.request_id
不同。
我需要提取ID
。
答案 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" ...
希望这有帮助!