使用Active Record检索具有唯一字段的记录

时间:2019-11-15 06:50:18

标签: ruby-on-rails postgresql

我有一个具有电话字段的ActiveRecord用户模型。一些用户使用相同的电话。我想要一个具有唯一电话号码的用户列表。如果多个用户使用相同的电话号码,那么我不在乎选择哪个。在Rails控制台中,我可以做

User.unscoped.group(:telephone).count

这给出了每个电话号码出现的次数,因此User.group(:telepone)似乎是一个不错的起点(我需要进行无范围限制,因为模型上定义了默认范围)。但是,如果我输入

User.unscoped.group(:telephone).first

我得到一个例外:

ActiveRecord::StatementInvalid: PG::GroupingError: ERROR:  column "users.id" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT  "users".* FROM "users" GROUP BY "users"."name" ORDER...
                ^
: SELECT  "users".* FROM "users" GROUP BY "users"."name" ORDER BY "users"."id" ASC LIMIT $1
/Users/Chris/.rvm/gems/ruby-2.5.7@golf_mentor/gems/activerecord-5.2.3/lib/active_record/connection_adapters/postgresql_adapter.rb:677:in `async_prepare'

如何使用User.unscoped.group(:name来实现我想要的东西。

1 个答案:

答案 0 :(得分:2)

  

我想要一个具有唯一电话号码的用户列表

您可以通过致电User.unscoped.select("DISTINCT ON (telephone) *").order("telephone DESC")

获取此列表

需要订购部分,否则您将遇到此错误:

Caused by PG::InvalidColumnReference: ERROR:  SELECT DISTINCT ON expressions must match initial ORDER BY expressions

更新

如评论中所述,不再需要Rails 6和PostgreSQL 11.3 order