我有一个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
来实现我想要的。 最佳答案
我要一份有唯一电话号码的用户名单
您可以通过致电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
部件不再需要。关于ruby-on-rails - 使用Active Record检索具有唯一字段的记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58871697/