为何count别名列未作为ActiveRecord_Relation的字段返回?
Rails ActiveRecord 查询聚合字段访问问题解答
1. 为什么只能通过sg[0]["cnt"]获取cnt的值?
你在查询中额外通过count(student_group_members.id) as cnt生成了一个聚合字段,但StudentGroup模型对应的数据库表中并没有定义cnt这个字段。ActiveRecord 只会为模型数据表中存在的字段自动生成 getter/setter 方法,对于查询时新增的别名字段,这些值仅会被存储在实例的attributes哈希里,无法直接通过方法调用(比如.cnt)访问,只能用哈希下标(["cnt"])的方式读取。
2. 如何让cnt成为每条记录的可直接调用字段?
有两种简单可行的处理方式:
方法一:给模型添加虚拟属性
在StudentGroup模型文件中添加只读属性,让实例可以通过方法调用直接访问cnt:
class StudentGroup < ApplicationRecord # 其他业务代码... attr_reader :cnt end
添加后,查询返回的StudentGroup实例就可以直接用.cnt获取聚合值,比如sg[0].cnt。
方法二:使用read_attribute方法(无需修改模型)
如果不想改动模型代码,可以通过ActiveRecord内置的read_attribute方法直接读取属性哈希中的值:
sg[0].read_attribute(:cnt)
这种方式不需要修改模型,但可读性不如方法一。
额外补充:你的查询中where(id: [3,4,5,6,6,7,7,8,8])可以简化为where(id: [3,4,5,6,7,8]),数组中的重复ID不会对查询结果产生影响,ActiveRecord会自动处理去重。
内容的提问来源于stack exchange,提问作者sofs1
相关产品推荐
相关产品推荐

