将在SQLite中工作的查询转换为适用于Postgres

时间:2015-05-24 22:57:32

标签: ruby-on-rails postgresql heroku sqlite

Message.order("created_at DESC").where(user_id: current_user.id).group(:sender_id, :receiver_id).count

与我的开发环境SQLite3一起使用Rails 3.2应用程序,但在使用Postgres将其推送到Heroku时出现此错误:

PG::GroupingError: ERROR: column "messages.created_at" must appear in the GROUP BY clause or be used in an aggregate function

它似乎在查询中需要:created_at。无法想出任何东西。有什么想法吗?

谢谢

1 个答案:

答案 0 :(得分:1)

PostgreSQL无法确定如何通过created_at订购。

假设您找到2组(:sender_id, :receiver_id),例如[1, 2]
[1, 3]
现在假设在第一组中有2条消息,一条来自1天前,一条来自1分钟前。并且让我们说你在12小时前在第二组中有1条消息 然后ORDER BY created_at DESC没有任何意义:你是否将1天前的消息作为第一组的created_at(因此第一组出现在第二组之后),或者从1分钟前(在这种情况下,第一组现在首先出现)?

这就是为什么PostgreSQL说你需要created_at中的GROUP BY(在这种情况下你现在有 3个不同的组,作为第一个一个现在被分成两部分),或者您需要使用聚合函数将created_at的多个值转换为单个值。

这将运行(我不知道您期望结果是什么,您可能不想使用MAX(created_at)!您可以找到PostgreSQL的聚合函数列表 here):

Message.order("MAX(created_at) DESC")
       .where(user_id: current_user.id)
       .group(:sender_id, :receiver_id)
       .count