【问题标题】:Current conversations logic for simple messaging system简单消息系统的当前对话逻辑
【发布时间】:2011-10-06 01:50:35
【问题描述】:

我正在使用 Rails3 构建一个简单的消息传递系统,允许用户相互发送私人消息。每组用户之间可以有一个消息流(如发短信)

但是,我对用于构建显示用户当前所有对话的视图的逻辑感到困惑。这包括可能只包含我自己发送的消息的对话。

我的架构具有以下内容:

  create_table "messages", :force => true do |t|
    t.integer  "from_id"
    t.integer  "to_id"
    t.string   "message"
    t.datetime "created_at"
    t.datetime "updated_at"
  end 

我想模拟类似于 FB 消息传递的东西,它为每个对话显示一行。`

任何想法都会非常有帮助。

谢谢! 丹尼

【问题讨论】:

  • 你能不能有一个像this onethis 结合的jquery-ui 标签栏。然后你可以使用fayethis 来发送消息。在 javascipt 中,您可以获取传入消息以启动带有新对话的新选项卡。
  • 我正在寻找 sql/rails finder 的帮助来帮助实现这一目标,但谢谢!
  • 我在这里并没有真正看到问题,只是请求设计理念。无论如何,您可能希望在模型中添加线程 ID,因为两个人可以同时进行两个不同的对话。

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord


【解决方案1】:

有两组消息需要考虑:

  • from_id 是当前用户的那些。
  • to_id 是当前用户的那些。

我会选择find_by_sql,让数据库完成所有工作:

chatting_with = User.find_by_sql(%Q{
    select * from users where id in (
        select to_id   as user_id from messages where from_id = :the_user
        union all
        select from_id as user_id from messages where to_id   = :the_user
    )
}, :the_user => the_user_in_question.id)

SQL UNION 只是简单地对两个结果集进行集合并集,因此上面将获取the_user_in_question 已向其发送消息的所有用户,并将其与已向the_user_in_question 发送消息的用户组合;结果将是所有与the_user_in_question 对话的用户作为用户实例的数组。由于 UNION 上有一个IN,您可以使用 UNION ALL 来避免在 UNION 中进行一些额外的工作。

您可能希望将其包装在 Message 的类方法中:

def self.conversations_involving(user)
    User.find_by_sql(%Q{
        select * from users where id in (
            select to_id   as user_id from messages where from_id = :the_user
            union all
            select from_id as user_id from messages where to_id   = :the_user
        )
    }, :the_user => user.id)
end

然后你可以这样说:

@other_users = Message.conversations_involving(current_user)

在您的控制器中。

您还需要为数据库中的messages.from_idmessages.to_id 添加索引。

【讨论】:

    猜你喜欢
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多