Rails:如何通过Scope获取单个数据库字段值(学生表年龄)
解决Rails模型根据ID获取单个age数值的问题
你原来的scope无效,是因为select(:age)返回的是ActiveRecord::Relation集合对象,哪怕只匹配到一条记录,它也不是单个数值,所以无法直接拿到你要的age值。以下是几种符合你需求的实现方式:
方法一:使用pick方法(推荐)
pick方法会直接从数据库查询指定字段的单个值,因为你的id是唯一的,它只会返回匹配记录的age数值(不是数组):
scope :get_age, ->(id) { where(id: id).pick(:age) }
调用后直接返回整数类型的age值,比如12;如果找不到对应id的记录,返回nil。
方法二:用find_by获取记录后取属性
通过find_by找到匹配的记录对象,再直接取age属性,用安全导航符&.避免找不到记录时触发报错:
scope :get_age, ->(id) { find_by(id: id)&.age }
或者写成更直观的类方法(很多场景下类方法比scope更清晰):
def self.get_age(id) find_by(id: id)&.age end
为什么不推荐pluck?
你提到pluck会返回数组,确实pluck(:age)会返回[12]这样的数组,要拿到单个值还得加[0]或者first,不如上面两种方法直接。
内容的提问来源于stack exchange,提问作者aj soprano
相关产品推荐
相关产品推荐

