在rails 3中模拟用户的消息

我构建了以下模型来处理用户的消息交换:

create_table "messages", :force => true do |t| t.integer "source_id" t.integer "destination_id" t.string "object" t.string "body" t.datetime "created_at" t.datetime "updated_at" end 

这些是它的联想:

 class Message 'User', :foreign_key=>'source_id' belongs_to :reciever, :class_name=>'User', :foreign_key=>'destination_id' end 

而这些是另一方的关联(用户模型):

  has_many :sent_messages, :class_name=> 'Message', :foreign_key=>'source_id', :dependent=>:destroy has_many :recieved_messages, :class_name=> 'Message', :foreign_key=>'destination_id', :dependent=>:destroy 

该模型是正确的并且正常工作,实际上从我可以检索的消息中,谁是发送者,谁是接收者,从用户,我可以获得所有发送和接收的消息。 不幸的是,它不处理任何情况:如果接收者或发送者删除消息怎么办? 消息是独一无二的,所以它在两边都消失了(坏事)。 如何知道其中一方是否已阅读该消息? 有什么建议吗? 你认为我必须重新计划吗? TNX

这是一个很好的问题! 我会建模,以尽可能地与电子邮件模型进行比较。 因此,消息始终属于单个用户,并且已发送或接收。

简而言之:

  create_table "messages", :force => true do |t| t.integer :user_id t.string :subject t.string :body t.boolean :sent end 

该模型希望:

 class Message < ActiveRecord::Base belongs_to :user scope :sent, where(:sent => true) scope :received, where(:sent => false) end 

并在用户:

 class User has_many :messages end 

然后,您只需查询所有已发送的消息即可

 user.messages.sent 

和收到的消息

 user.messages.received 

发送消息确实变得有点复杂:

 class Message def send_message(from, recipients) recipients.each do |recipient| msg = self.clone msg.sent = false msg.user_id = recipient msg.save end self.update_attributes :user_id => from.id, :sent => true end end 

或者类似的东西:你复制邮件并将其附加到所有收件人,最后使原始邮件成为发送的邮件。

这样,每个用户都可以完全控制消息。

可能的改进:

  • 同时保留对消息中发送者和接收者的明确引用,以便能够允许回复和填充
  • 而不是使用单个布尔值,也许允许使用文件夹?

希望这可以帮助。

您可以添加两个布尔值,将发件人和收件人的邮件标记为已删除。 然后在设置其中任何一个之后检查是否可以永久删除该消息。

例:

 create_table "messages", :force => true do |t| t.boolean :sender_deleted t.boolean :receiver_deleted end 

在模型中:

 class Message def self.delete_message(id) m = Message.find(id) m.destroy if m.sender_deleted && m.receiver_deleted end end 

您可以使用:dependent=>:nullify对已删除的记录进行:dependent=>:nullify

 has_many :sent_messages, :class_name=> 'Message', :foreign_key=>'source_id', :dependent=>:nullify has_many :recieved_messages, :class_name=> 'Message', :foreign_key=>'destination_id', :dependent=>:nullify 

在显示消息的发送者/接收者已被删除的消息时,您需要处理,因为sender_id或destination_id将为空,但消息将保持不变。