使用belongs_to / has_many关系对会话进行排序

时间:2016-06-08 07:12:38

标签: ruby-on-rails postgresql ruby-on-rails-4 activerecord

我有以下型号:

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对所有会话进行分组,并按日期对这些群组进行排名 - &gt;具有最新消息的(对话)组应显示在顶部。这是我到目前为止的截图。 Sorting conversations

所有的关系应该按照他们所属的帖子进行分组。如果任何会话中有新消息,则整组会话应移至视图顶部,而不仅仅是与新消息的会话。这就是我无法开展的工作。

上面的屏幕截图是使用以下代码制作的:

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分组。但是第二组应该出现在第一组之上,因为第二组中的对话中包含最新消息。

感谢任何帮助。非常感谢!

1 个答案:

答案 0 :(得分:0)

你的方式不起作用的原因,就像@lusketeer在这个问题下评论的那样:

because you ordered by `posts.id` first

解决方案应首先对帖子进行分组,然后加载对话和消息,并按消息时间戳排序:

# Add the association between user and post
class User < ActiveRecord::Base
  has_many: :participated_posts, through: :conversation, class: "Post"
  ...
end

current_user.participated_posts.includes(conversations: [:messages, :user]).order("messages.created_at DESC")