2011-12-06 3 views
5
나는 다음과 같은 두 가지 모델을 가지고

스레드.레일은 비공개 메시지

내 '색인'컨트롤러 동작에서 보낸 메시지와받은 메시지를 어떻게 쿼리합니까? 예를 들어, User1이 '/ users/2/messages /'에 도달하면 첫 번째 메시지를 보낸 사람과 관계없이 user1과 user2 사이의 전체 대화를 볼 수 있습니다. 'Thread'모델을 추가해야합니까, 아니면 현재 구조로이 작업을 수행 할 수 있습니까?

감사합니다.

답변

16

체인에서 일련의 상호 연결된 메시지보다 사람에 참여할 수있는 대화로 구조 조정하는 것이 더 나을 것입니다. 예를 들어 :

class Conversation < ActiveRecord::Base 
    has_many :messages 
    has_many :participants 
    has_many :users, :through => :participants 
end 

class Message < ActiveRecord::Base 
    belongs_to :conversation 
end 

class Participant < ActiveRecord::Base 
    belongs_to :conversation 
    belongs_to :user 
end 

class User < ActiveRecord::Base 
    has_many :conversations 
    has_many :participants 
end 

메시지를 다른 사람에게 전송, 그것에 대한 대화를 만들고 users 목록에 추가하여 해당 당사자를 초대합니다.

메시징에 부모 관계를 구축하거나 조상을 사용하여 스레드 된 메시징을 여기에 추가 할 수 있습니다. 실제로는 대부분의 사람들에게 간단한 연대순으로 응답하는 순서로 충분하므로 일반적으로 과도한 경향이 있습니다.

읽음/읽지 않음 상태를 추적하려면 사용자와 메시지 간의 연결 테이블이 직접 필요하며 이는 까다로울 수 있으므로 필요하지 않으면 피하십시오.

일부 이름은 Ruby 또는 Rails에서 예약되며 Thread은 그 중 하나이므로 해당 이름의 모델을 가질 수 없습니다.

+1

2 명의 사용자간에 간단한 대화를 찾는 방법을 찾았습니다. 그것이 효과가있는 것처럼 보입니다. 감사! 하지만 User 모델에서 'has_many : conversations, : through => : participants'가되어서는 안됩니까? – Vickash

+1

사용자 모델에서 누락 된': through'에 대해 당신이 맞습니다. 'has_many : participants'도 있어야합니다. – tadman

+0

방금 ​​앱에서이 모델을 사용했지만 메시지를 만들고 회신하기 위해 작성된 컨트롤러를 얻으려고 애 쓰고 있습니다. 간단한 예가있을 수 있습니까? 그게 더 나은 경우 나는 새로운 질문으로 그것을 시작할 수 있습니다. – Dave