Ruby on rails rails查询联接、按订单、按问题分组

Ruby on rails rails查询联接、按订单、按问题分组,ruby-on-rails,join,group-by,Ruby On Rails,Join,Group By,在项目中有三个模型 谈话 对话信息 信息 对话.rb class Conversation < ActiveRecord::Base #subject has_many :conversation_messages, :dependent => :destroy has_many :messages, :through => :conversation_messages, :dependent => :destroy, :order =>

在项目中有三个模型

  • 谈话
  • 对话信息
  • 信息
对话.rb

class Conversation < ActiveRecord::Base
    #subject
    has_many :conversation_messages, :dependent => :destroy
    has_many :messages, :through => :conversation_messages, :dependent => :destroy, :order => "created_at DESC"
end
class ConversationMessage < ActiveRecord::Base
  #conversation_id, message_id
  belongs_to :conversation
  belongs_to :message, :dependent => :destroy
end
因此,我想检索当前用户的所有对话,并希望按收到或发送的最后一条消息的顺序显示它们。 还希望为其所有消息显示单个对话,并且对话必须按其中包含的消息排序。 使用rails 3.0

我尝试了以下查询,但在下面给出了一个错误 质疑

错误


您需要在
子句中包含
消息。在
处创建:

@user_conversations = Conversation
.joins(:messages)
.where(["messages.receiver_id = ?  or messages.sender_id = ?", current_user.id, current_user.id ])
.group("conversations.id, messages.created_at")
.order("messages.created_at DESC")

请参阅:

使用

.order(“max(messages.created_at)DESC”)

并从
部分删除
消息。在
处创建

@user_conversations = Conversation
.joins(:messages)
.where(["messages.receiver_id = ?  or messages.sender_id = ?", current_user.id, current_user.id ])
.group("conversations.id")
.order("max(messages.created_at) DESC")
它为您提供“按最新评论排序的独特对话”


它不仅仅是通过
消息进行排序。我想,在
处创建,而是通过更改
max
min
DESC
ASC
来完成您想要的任务。

我想显示所有相关消息的单个对话,对话列表必须按消息排序到对话中。哇,非常感谢你这么做。包含的
max()
是工作和不工作之间的区别——这让我的大脑好几天都崩溃了。
PG::GroupingError: ERROR:  column "messages.created_at" must appear in the GROUP BY clause or be used in an aggregate function
@user_conversations = Conversation
.joins(:messages)
.where(["messages.receiver_id = ?  or messages.sender_id = ?", current_user.id, current_user.id ])
.group("conversations.id, messages.created_at")
.order("messages.created_at DESC")
@user_conversations = Conversation
.joins(:messages)
.where(["messages.receiver_id = ?  or messages.sender_id = ?", current_user.id, current_user.id ])
.group("conversations.id")
.order("max(messages.created_at) DESC")