2011-12-06 39 views
5

我有以下兩種模式:Rails的線程私人信息

class Message < ActiveRecord::Base 
    belongs_to :to_user, :class_name => 'User' 
    belongs_to :from_user, :class_name => 'User' 

    has_ancestry #Using the 'ancestry' gem 
end 

class User < ActiveRecord::Base 
    has_many :messages_received, :class_name => 'Message', :foreign_key => 'to_user_id' 
    has_many :messages_sent, :class_name => 'Message', :foreign_key => 'from_user_id' 
end 

允許每個用戶有一個與其他用戶一個對話,所有的答覆應該從原來的消息線程。

在我的「索引」的控制器動作我怎麼查詢都發送的消息和接收的消息?例如,如果User1點擊「/ users/2/messages /」,他們應該看到user1和user2之間的整個對話(不管誰發送第一條消息)。我是否需要添加一個「線程」模型,或者是否有一種方法可以用我當前的結構完成此任務?

謝謝。

回答

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

一直在尋找一種方法,使用戶之間簡單的對話時,我發現這一點。看起來它會工作。謝謝!但是,它不應該是用戶模型中的'has_many:會話,:通過=>:參與者'嗎? – Vickash

+1

你對用戶模型中缺少的':through'是正確的。它也應該有'has_many:參與者'。 – tadman

+0

我剛剛在我的應用程序中使用了這個模型,但我真的很努力想要創建和回覆消息的控制器。有沒有簡單例子的機會?如果更好,我可以將它作爲一個新問題開始。 – Dave