2016-06-08 103 views
0

我有以下型号排序对话:有belongs_to的/的has_many关系

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)组根据帖子ID,他们belong_to和按日期排列此组中的所有对话 - >集团(的对话)与最新的消息应该出现在最上面。这是截至目前为止我的截图。 Sorting conversations

所有covnerations应该按他们属于在每个时间的帖子分组。如果任何会话中都有新消息,则整个会话组应移至视图的顶部,而不仅仅是与新消息的会话。这是我无法工作的原因。

上面的截图是用下面的代码所做的:

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

任何帮助表示赞赏。非常感谢!

+0

,因为你在'posts.id'第一有序,'posts.id DESC,messages.created_at DESC' – lusketeer

+0

@lusketeer排序由'messages.created_at'首先'post.id破坏分组' - 这是实际的问题。假设某人在特定对话中发送了新消息 - >那么这个特定对话将排在最前面。但所有其他对话(属于同一职位)保持在同一位置。我想实现的是,属于同一职位的所有对话都排在最前面。 – Tom

回答

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") 
相关问题