2011-09-05 51 views
3

我正在用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消息的東西,顯示一排每個conversation.`

任何想法將超級有益的。

謝謝! 丹尼

+0

你可以有一個像[這一個](http://jqueryui.com/demos/tabs/#bottom)與[this]結合的jquery-ui標籤欄(http://jqueryui.com/demos/tabs /#操縱)。然後你可以像[this](http://railscasts.com/episodes/260-messaging-with-faye)一樣使用[faye](http://faye.jcoglan.com/)來進行消息傳遞。在javascipt中,您可以通過新的對話獲得傳入消息以啓動新選項卡。 –

+0

我正在尋找與幫助達到此目的的sql/rails finder的幫助,但謝謝! – Danny

+0

我在這裏沒有真正看到一個問題,只是對設計思路的一個要求。無論如何,您可能需要爲您的模型添加線索ID,因爲兩個人可以同時進行兩個不同的對話。 – pduey

回答

6

有兩組信息的考慮:

  • 那些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對話的用戶作爲User實例的數組。由於UNION上有一個IN,因此可以使用UNION ALL來避免UNION中的一些額外工作。

你可能想包裝在一個類的方法上的消息:

然後你可以只說這樣的話:

@other_users = Message.conversations_involving(current_user) 
在控制器

您也可以在數據庫中添加索引到messages.from_idmessages.to_id