将MySQL切换为Postgres:"列必须出现在GROUP BY子句中或用于聚合函数"

时间:2014-05-05 14:52:14

标签: mysql ruby-on-rails database postgresql ruby-on-rails-4

将rails应用程序从MySQL切换到Postgres会出现以下错误:

ERROR: column "contacts.id" must appear in the GROUP BY clause or be used in an aggregate function

以下是相关范围:

class User < MyModel
  def self.top_contacts(timeframe = 1.week.ago, limit = 5)
    Contact.unscoped
          .where('created_at between ? and ?', timeframe, Time.now)
          .group(:user_id)
          .order('sum(score) DESC')
          .limit(limit)
          .includes(:user)
          .collect{|x| x.user}
  end
end
  1. 如何解决这个问题?
  2. 不是使用Rails作为数据库抽象层,确保切换数据库应该无缝地工作吗?

1 个答案:

答案 0 :(得分:2)

问题出在SQL的级别上,这在您的ORM层中是不可见的。问题恰恰在于RoR ORM,因为它似乎生成了一个MySQL友好的查询,它使用了MySQL的一个非凡功能,postgresql没有。

快速解决方案:将contacts.id提供给您正在进行分组的列:

.group("user_id, contacts.id");