在rails 3中模拟用户的消息

Joe*_*Joe 10 messaging model ruby-on-rails

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

 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
Run Code Online (Sandbox Code Playgroud)

这些是它的联想:

class Message < ActiveRecord::Base
  belongs_to :sender, :class_name=>'User', :foreign_key=>'source_id'
  belongs_to :reciever, :class_name=>'User', :foreign_key=>'destination_id'
end
Run Code Online (Sandbox Code Playgroud)

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

 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
Run Code Online (Sandbox Code Playgroud)

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

nat*_*vda 7

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

简而言之:

 create_table "messages", :force => true do |t|
    t.integer  :user_id
    t.string   :subject
    t.string   :body
    t.boolean  :sent
  end
Run Code Online (Sandbox Code Playgroud)

该模型希望:

class Message < ActiveRecord::Base
  belongs_to :user

  scope :sent, where(:sent => true)
  scope :received, where(:sent => false)

end
Run Code Online (Sandbox Code Playgroud)

并在用户:

class User    
  has_many :messages
end
Run Code Online (Sandbox Code Playgroud)

然后,您就可以通过查询所有已发送的消息

user.messages.sent
Run Code Online (Sandbox Code Playgroud)

和收到的消息

user.messages.received
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

可能的改进:

  • 还要明确引用消息中的发件人和收件人,以便能够允许回复和填写内容
  • 而不是使用单个布尔值,也许允许使用文件夹?

希望这可以帮助.