2011-12-06 36 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