首页 > 解决方案 > 无法弄清楚 Active Record distinct 方法发生了什么

问题描述

我正在尝试根据 user_id 从模型表中选择不同的记录。我试过用几种可能的方式写这个。我不明白为什么将 distinct 与 pluck[2] 一起使用会返回正确的值,而只有 distinct[3] 似乎根本不起作用。我在这里想念什么?

使用'rails','~> 5.2.3'。

[1] pry(main)> Model.select(:user_id).distinct.count
   (2967.7ms)  SELECT COUNT(DISTINCT "models"."user_id") FROM "models"
=> 11432

[2] pry(main)> Model.distinct(:user_id).pluck(:user_id).count
   (690.6ms)  SELECT DISTINCT "models"."user_id" FROM "models"
=> 11432

[3] pry(main)> Model.distinct(:user_id).count
   (1076.7ms)  SELECT COUNT(DISTINCT "models"."id") FROM "models"
=> 2531300

标签: ruby-on-railsrubypostgresqlactiverecord

解决方案


user_id1) 这是使用 ActiveRecord 查询语言计算数据库中不同值数量的正确方法。

2)注意pluck已经运行了数据库查询。这意味着它将所有记录加载到内存中,然后计算该数组中的元素数。

3) 的参数distinct不是列名而是布尔值。这意味着调用distinct(:user_id)基本上与调用distinct(true)true默认相同。这意味着

Model.distinct(:user_id).count

是相同的

Model.distinct.count

推荐阅读