首页 > 解决方案 > 如何让 ActiveRecord 将中间表中的附加值映射到包含的模型中?

问题描述

当使用 ActiveRecord 的includes预加载方法时,生成的 SQL 是一个中间表,由从父类的表中选择的列和包含中指定的任何表组成。例如:

Subject.includes(:topics).references(:topics)
# OR
Subject.eager_load(:topics)

将生成一个查询,该查询会生成一个表,其中包含来自表和表的subjectstopics。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 将值映射到分支/叶节点?

标签: sqlruby-on-railsactiverecord

解决方案


推荐阅读