我有一个具有电话字段的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
来实现我想要的东西。
答案 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
。