2011-06-03 59 views
2

以下SQLite的代码组信息由conversation_id:SQLite的到的Postgres(Heroku的)GROUP BY

@messages=Message.where("messages.sender_id = (?) OR messages.recipient_id = (?)" 
      , current_user.id, current_user.id).group("messages.conversation_id") 

在移动到的Heroku,这个代码不被识别的Postgres。望着日志,我告诉所有的信息列添加到GROUP BY - 让我到这个功能代码:

@messages=Message.where("messages.sender_id = (?) OR messages.recipient_id = (?)" 
      , current_user.id, current_user.id).group("messages.conversation_id 
      , messages.updated_at, messages.id, messages.sender_id 
      , messages.recipient_id, messages.sender_deleted 
      , messages.recipient_deleted, messages.body, messages.read_at 
      , messages.ancestry, messages.ancestry_depth, messages.created_at") 

只有这个代码由conversation_id不正确组。它只是输出符合WHERE条件的所有消息。有任何想法吗?

回答

2

我到达与使用DISTINCT ON一个实用的解决方案:

@messages = Message.select("DISTINCT ON (messages.conversation_id) * ") 
        .where("messages.sender_id = (?) OR messages.recipient_id = (?)", current_user.id, current_user.id) 
        .group("messages.conversation_id, messages.updated_at, messages.id, messages.sender_id, messages.recipient_id, messages.sender_deleted, messages.recipient_deleted, messages.body, messages.read_at, messages.ancestry, messages.ancestry_depth, messages.created_at") 

然而,SQLite中这不会工作。推荐下载Postgres并直接使用它,而不必在开发中使用SQLite代码,在生产中使用Postgres代码(Heroku)。

0

PostgreSQL要求您对所有非聚合属性进行分组。分组就是说你想要分组属性的独特组合,所以询问所有的信息是没有意义的。我不知道RoR,但你必须单独询问conversation_id(如果需要,可能会有综合信息)。但是因为你要求提供消息表的所有信息,所以我想你可能真的想按对话ID排序?

+0

不,通过conversation_id排序只会以不同的方式排序它们。我试图在每个对话中显示最后一条消息(这是一组具有相同conversation_id的消息) – neon 2011-06-03 21:11:52