2011-09-05 3 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 

나는 각 conversation.`

어떤 아이디어가 매우 도움이 될 것입니다에 대한 행을 표시 FB 메시지 비슷한을 모방하고 싶은 :

내 스키마는 다음이있다.

감사합니다. 대니

+0

[this] (http://jqueryui.com/demos/tabs/#bottom)과 [jqueryui.com/demos/tabs]와 같은 jquery-ui 탭 막대를 사용할 수 있습니까? /#시장 조작). 그런 다음 [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과 대화하는 모든 사용자가됩니다. UNION에 IN이 있으므로 UNION을 사용하여 UNION에서 약간의 추가 작업을 피할 수 있습니다.

을 그리고 당신은 같은 것을 말할 수 있습니다 :

당신은 아마 메시지에 클래스 메소드에 그 포장 싶어 컨트롤러에

@other_users = Message.conversations_involving(current_user) 

합니다.

messages.from_idmessages.to_id에 인덱스를 추가 할 수도 있습니다.