我有以下型号:
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;具有最新消息的(对话)组应显示在顶部。这是我到目前为止的截图。
所有的关系应该按照他们所属的帖子进行分组。如果任何会话中有新消息,则整组会话应移至视图顶部,而不仅仅是与新消息的会话。这就是我无法开展的工作。
上面的屏幕截图是使用以下代码制作的:
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 :(得分: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")