2011-06-03 56 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