【发布时间】:2016-06-08 07:12:37
【问题描述】:
我有以下型号:
class Post < ActiveRecord::Base
has_many :conversations
end
class Conversation < ActiveRecord::Base
belongs_to :user
belongs_to :post
has_many :messages
end
class Message < ActiveRecord::Base
belongs_to :conversation
end
所以有帖子,每个帖子可以有很多对话。在每个对话中都有许多消息。到目前为止一切顺利。
现在我想显示用户所有对话的概览。看来我无法让它按我想要的方式工作:
获取当前用户拥有的所有对话 (current_user.conversations) 根据他们 belong_to 的帖子 ID 对所有对话进行分组,并按日期对该组进行排名 -> 包含最新消息的(对话)组应显示在顶部。这是我到目前为止的屏幕截图。
所有的合作都应该按照他们在任何时候所属的帖子进行分组。如果任何对话中包含新消息,则整个对话组应移至视图顶部,而不仅仅是包含新消息的对话。这就是我无法工作的原因。
上面的截图是用以下代码制作的:
current_user.conversations.includes(:messages, post: :user).order("posts.id DESC, messages.created_at DESC").to_a.paginate( :page => params[:page], :per_page => 10 )
正如您在屏幕截图中看到的那样,对话按帖子 ID 分组。但是第二组应该出现在第一组上方,因为第二组中的对话包含最新消息。
感谢任何帮助。非常感谢!
【问题讨论】:
-
因为你是先由
posts.id订购的,posts.id DESC, messages.created_at DESC -
@lusketeer 由
messages.created_at排序首先破坏了post.id的分组——这才是真正的问题。假设某人在特定对话中发送了一条新消息-> 然后该特定对话排在首位。但是所有其他对话(属于同一个帖子)保持在同一个位置。我想要实现的是,属于同一个帖子的所有对话都排在首位。
标签: ruby-on-rails postgresql ruby-on-rails-4 activerecord