Ruby on rails 将在SQLite中工作的查询转换为在Postgres中工作的查询

Ruby on rails 将在SQLite中工作的查询转换为在Postgres中工作的查询,ruby-on-rails,postgresql,heroku,sqlite,Ruby On Rails,Postgresql,Heroku,Sqlite,适用于Rails 3.2应用程序的my dev环境SQLite3,但在使用Postgres推送到Heroku时失败,错误如下: Message.order("created_at DESC").where(user_id: current_user.id).group(:sender_id, :receiver_id).count 它似乎想要在查询中的处创建。什么都想不出来。有什么想法吗 谢谢PostgreSQL无法按照您在创建的进行订购 假设您找到两组(:发送方id,:接收方id),例如[1

适用于Rails 3.2应用程序的my dev环境SQLite3,但在使用Postgres推送到Heroku时失败,错误如下:

Message.order("created_at DESC").where(user_id: current_user.id).group(:sender_id, :receiver_id).count
它似乎想要在查询中的处创建。什么都想不出来。有什么想法吗


谢谢

PostgreSQL无法按照您在创建的
进行订购

假设您找到两组
(:发送方id,:接收方id)
,例如
[1,2]

[1,3]

现在假设在第一组中有两条消息,一条来自1天前,另一条来自1分钟前。假设您在12小时前的第二组中有1条消息。
然后,在DESC创建的
顺序没有任何意义:您是将1天前的消息作为第一组的
创建的消息(因此第一组出现在第二组之后),还是1分钟前的消息(在这种情况下,第一组现在先出现)

这就是为什么PostgreSQL说您需要在
分组中创建
(在这种情况下,您现在有3个不同的分组,因为第一个分组现在被拆分为两个),或者您需要使用聚合函数将在
创建的
的多个值转换为单个值


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


您是否尝试根据查询的需要将:created_at添加到查询中
Message.order(“created_at DESC”).where(user_id:current_user.id).group(:sender_id,:receiver_id,:created_at).count
@hd1:这将使Postgre接受查询,但结果可能不是所需的结果:从用户1发送到用户2的2条消息不会分组在一起,除非它们在准确的时间发送,这是不太可能的(而且可能不是想要的行为)。以上两条评论都是肯定的。Adding:created_at将使Postgres的查询工作正常,但结果不正确。实际上,它不再分组了,因为每条消息都有一个唯一的:created_列。@slindsey3000:我在下面发布的答案对你不起作用吗?我正在等待我网站上的流量减少一点,先生,然后将其推上生产。我必须有一个Rails.env标志,因为我运行SQLite local。我会建议的。谢谢你,先生。希望它能起作用!工作。谢谢你,先生。完美地
PG::GroupingError: ERROR: column "messages.created_at" must appear in the GROUP BY clause or be used in an aggregate function
Message.order("MAX(created_at) DESC")
       .where(user_id: current_user.id)
       .group(:sender_id, :receiver_id)
       .count