我正在为 Rails 应用程序编写一个 facebook 风格的消息系统,但在选择收件箱的消息时遇到了问题(使用 will_paginate)。
消息以线程的形式组织,在收件箱中,线程的最新消息将显示,并带有指向该线程的链接。线程是通过与自身的 parent_id 1-n 关系组织的。
到目前为止,我正在使用这样的东西:
class Message < ActiveRecord::Base
belongs_to :sender, :class_name => 'User', :foreign_key => "sender_id"
belongs_to :recipient, :class_name => 'User', :foreign_key => "recipient_id"
has_many :children, :class_name => "Message", :foreign_key => "parent_id"
belongs_to :thread, :class_name => "Message", :foreign_key => "parent_id"
end
class MessagesController < ApplicationController
def inbox
@messages = current_user.received_messages.paginate :page => params[:page], :per_page => 10, :order => "created_at DESC"
end
end
这给了我所有的消息,但是对于一个线程,线程本身和最新消息将出现(而不仅仅是最新消息)。我也不能使用 GROUP BY 子句,因为对于线程本身(可以说是父级),parent_id = nil 当然。
任何人都知道如何以优雅的方式解决这个问题?我已经考虑过将 parent_id 添加到父级本身,然后按 parent_id 分组,但我不确定这是否有效。
谢谢