sql - 如何让 ActiveRecord 将中间表中的附加值映射到包含的模型中?
问题描述
当使用 ActiveRecord 的includes
预加载方法时,生成的 SQL 是一个中间表,由从父类的表中选择的列和包含中指定的任何表组成。例如:
Subject.includes(:topics).references(:topics)
# OR
Subject.eager_load(:topics)
将生成一个查询,该查询会生成一个表,其中包含来自表和表的subjects
列topics
。ActiveRecord 然后在相关模型之间分配这些列,以便人们可以访问模型上的属性而无需进行其他查询,例如:
subjects = Subject.includes(:topics).references(:topics)
subjects.first.title
subjects.first.topics.first.description # no additional query performed
现在,我想使用聚合计算进行自定义选择,并将其提供给主题模型实例。例如,我可以这样做:
subjects = Subject.includes(:topics).references(:topics).select('COUNT(subject.id) AS total_subjects')
subjects.first.total_subjects # outputs total number of subjects
但我也想这样做:
subjects = Subject.includes(:topics).references(:topics).select('COUNT(subject.id) AS total_subjects', 'COUNT(topics.id) AS total_topics')
subjects.first.topics.first.total_topics # outputs total number of topics
但是,ActiveRecord 仅将自定义选择结果映射到调用查询的类的模型实例(在本例中为 Subject 实例)。
有没有办法让 ActiveRecord 将值映射到分支/叶节点?
解决方案
推荐阅读
- python - 基于另一列 str Python 的条件字符串拆分
- java - FileInputStream 没有缓冲,为什么 BufferedInputStream 更快?
- node.js - escape 或 unescape 不适用于特定的 unicode 字符串 - Node Js
- java - 发送邮件时丢失格式
- python - 在 Robot Framework 中处理 Windows 弹出窗口
- c - 为什么我不能比较字符串
- c# - 使用 REST API 发布非英文字母
- python - 为什么python中像素值的自动变化?
- php - php中2个数组所需的差异键
- docker-compose - docker-compose 启动 cmd 设置环境变量