Ruby on rails 简单消息系统的当前会话逻辑

Ruby on rails 简单消息系统的当前会话逻辑,ruby-on-rails,ruby,ruby-on-rails-3,activerecord,Ruby On Rails,Ruby,Ruby On Rails 3,Activerecord,我正在用Rails3构建一个简单的消息传递系统,允许用户彼此发送私人消息。每组用户之间可以有单个消息流(如短信) 然而,我对用于构建显示用户当前所有对话的视图的逻辑感到困惑。这包括可能只包含我发送的消息的对话 我的模式具有以下特性: create_table "messages", :force => true do |t| t.integer "from_id" t.integer "to_id" t.string "message" t.da

我正在用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消息的东西,它为每个对话显示一行`

任何想法都会非常有用

谢谢!
Danny

有两组消息需要考虑:

  • 其中
    from\u id
    是当前用户
  • 其中
    to_id
    是当前用户
我会选择a,让数据库完成所有工作:

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 ALL来避免工会中的一些额外工作

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

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)
在你的控制器里


您还需要将索引添加到数据库中的
消息、from\u id
消息、to\u id

是否可以将jquery ui选项卡栏与。然后你可以使用like来发送消息。在javascipt中,您可以获得传入的消息,用新的对话启动一个新选项卡!我在这里看不到任何问题,只是对设计理念的要求。无论如何,您可能希望向模型中添加一个线程id,因为两个人可以同时进行两次不同的对话。