Rails ActiveRecord Model.uniq.pluck:id不适用于postgres

时间:2013-07-05 16:45:37

标签: ruby-on-rails postgresql activerecord ruby-on-rails-4

我有一个空的demo rails 4应用程序尝试执行以下操作:Collection.order('created_at ASC').uniq.pluck :name它在sqlite下运行,但在postgres中爆炸,出现以下错误:

(0.9ms)  SELECT DISTINCT "collections"."name" FROM "collections" ORDER BY created_at ASC
PG::Error: ERROR:  for SELECT DISTINCT, ORDER BY expressions must appear in select list
LINE 1: ...collections"."name" FROM "collections"   ORDER BY created_at...

这是一个错误或我该如何解决?

3 个答案:

答案 0 :(得分:2)

这似乎是PostgreSQL的一个问题。 (Rails 3 DISTINCT QUERY

要解决此问题,您可以使用select:

Collection.select([:name, :created_at]).order('created_at ASC').uniq.select(:name)

或者你可以让Ruby获得唯一的名称而不是SQL:

Collection.order('created_at ASC').pluck(:name).uniq

答案 1 :(得分:2)

我实际上是在尝试在active_admin上解决此问题。 https://github.com/gregbell/active_admin/issues/2324

现在解决方案似乎是Collection.reorder('name asc').uniq.pluck :name,这将覆盖default_scope或之前的订单,并使用name订购集合。这里奇怪的是reorder有效,而order导致问题......

答案 2 :(得分:1)

Collection.select([:id, :created_at]).order('created_at ASC').uniq.pluck(:id)