Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails 3-为私人消息设置对话id_Ruby On Rails_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails Rails 3-为私人消息设置对话id

Ruby on rails Rails 3-为私人消息设置对话id,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我正在尝试为我的Rails应用程序在用户之间实现一个简单的私有消息传递功能。我认为我的模型(用户和消息)设置正确,可以发送/接收简单的私人消息。但是,现在我想添加一个回复功能,它似乎需要某种线程——因此,我尝试使用messages表中的conversation_id列来跟踪这一点。有人对我如何设置对话id有什么建议吗?然后为后续回复消息再次设置 非常感谢您的帮助。此外,我认为这将有助于许多希望添加相同功能的新手程序员。谢谢 用户模型 has_many :sent_messages, :c

我正在尝试为我的Rails应用程序在用户之间实现一个简单的私有消息传递功能。我认为我的模型(用户和消息)设置正确,可以发送/接收简单的私人消息。但是,现在我想添加一个回复功能,它似乎需要某种线程——因此,我尝试使用messages表中的conversation_id列来跟踪这一点。有人对我如何设置对话id有什么建议吗?然后为后续回复消息再次设置

非常感谢您的帮助。此外,我认为这将有助于许多希望添加相同功能的新手程序员。谢谢

用户模型

has_many :sent_messages,     :class_name => "Message", :foreign_key => "sender_id"
has_many :received_messages, :class_name => "Message", :foreign_key => "receiver_id"
消息模型

belongs_to :sender,       :class_name => "User"
belongs_to :receiver,     :class_name => "User"  
belongs_to :conversation, :class_name => "Message", :foreign_key => "conversation_id"
has_many   :replies,      :class_name => "Message", :foreign_key => "conversation_id"

after_save :set_conversation_id  #only if nil (see private method below)

private

def set_conversation_id
  if self.conversation_id.nil?
    primary_key = self.id
    self.update_attributes(:conversation_id => primary_key)
  end
end
新消息表单(messages/New.html.erb)

方法1 离开你开始的地方

您可以从一个
对话
模型开始,该模型包含许多消息。创建新线程时,创建一个新的
对话
,并将其ID用于第一条消息。创建消息作为对现有消息的答复时,请复制消息的
对话\u id

# new conversation
conv = Conversation.create # parameters ...
message = conv.messages.build # parameters ...

# reply
message = origin.conv.messages.build # parameters
然而,这并不跟踪消息的顺序

方法2 我会怎么做

我会让每条消息都有一个
父id
,这是它作为回复的消息的主键。如果消息为“root”,则此字段将为空。在运行时,这可以用来派生会话线程

class Message
  has_one :child, class_name: 'Message', foreign_key: 'parent_id'
  belongs_to :parent, class_name: 'Message'
  # ...
方法3
使用或改编自。

Jim,我将尝试您的方法2(以避免使用其他模型)。对于在消息模型上运行after_save回调以将对话id设置为主键(如果对话id不存在-即,对于第一条消息),您认为如何?我已经更新了上面的代码,向您展示了我的意思。除非有明确的文档记录,否则我不会这么做。Future me可能会在跟踪消息时编写某种无限循环。
# new conversation
conv = Conversation.create # parameters ...
message = conv.messages.build # parameters ...

# reply
message = origin.conv.messages.build # parameters
class Message
  has_one :child, class_name: 'Message', foreign_key: 'parent_id'
  belongs_to :parent, class_name: 'Message'
  # ...