gpt4 book ai didi

mysql - Rails 中用于消息传递系统的 Tricky MySQL 查询 - 请帮助

转载 作者:行者123 更新时间:2023-11-30 23:43:10 24 4
gpt4 key购买 nike

我正在为 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 分组,但我不确定这是否可行。

谢谢

最佳答案

我的解决方案是获取线程列表(我假设可以通过没有父 ID 的消息获得)。然后在 Message 模型上,添加一个方法来查找线程中的最新消息并返回它。然后,您可以使用该方法获取每个线程中的最新方法,并轻松放入线程头部的链接。

(伪)代码:

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"

def get_last_message_in_thread()
last_message = self
children.each do |c|
message = c.get_last_message_in_thread()
last_message = message if message.created_at > last_message.created_at
end
return last_message
end
end

class MessagesController < ApplicationController

def inbox
@messages = current_user.received_messages.find_by_parent_id(Null).paginate :page => params[:page], :per_page => 10, :order => "created_at DESC"
end
end

与使用递归函数查找线程中的最后一条消息相比,您可能做得更好,但这是我能想到的用于演示该想法的最简单的解决方案。我也不确定在收件箱函数中查找未设置父 ID 的语法是否正确,这就是为什么我将代码标记为伪代码的原因:)

关于mysql - Rails 中用于消息传递系统的 Tricky MySQL 查询 - 请帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/932683/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com