以下SQLite代码组按conversation_id分组消息:
@messages=Message.where("messages.sender_id = (?) OR messages.recipient_id = (?)"
, current_user.id, current_user.id).group("messages.conversation_id")
在转移到Heroku时,Postgres无法识别此代码。查看日志,我被告知要将所有Message列添加到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条件的所有消息。有什么想法吗?
答案 0 :(得分:3)
我使用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)。
答案 1 :(得分:0)
PostgreSQL要求您对所有非聚合属性进行分组。分组有点说你想要分组属性的独特组合,所以询问所有信息是没有意义的。我不了解RoR,但您必须单独询问conversation_id
(如果需要,可能会提供汇总信息)。但是既然你要求在消息表上提供所有信息,我想你可能真的想按对话ID订购?