ruby-on-rails – 在rails 3中的模型用户的消息

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 在rails 3中的模型用户的消息前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经建立了以下模型来处理用户的消息交换:
  1. create_table "messages",:force => true do |t|
  2. t.integer "source_id"
  3. t.integer "destination_id"
  4. t.string "object"
  5. t.string "body"
  6. t.datetime "created_at"
  7. t.datetime "updated_at"
  8. end

这些是它的关联:

  1. class Message < ActiveRecord::Base
  2. belongs_to :sender,:class_name=>'User',:foreign_key=>'source_id'
  3. belongs_to :reciever,:foreign_key=>'destination_id'
  4. end

而另一方面则是另一方的关联(用户模型):

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

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

解决方法

这是一个很好的问题!我会建模,以尽可能的比较电子邮件模型.所以一个消息总是属于一个用户,它是发送或接收的.

简而言之:

  1. create_table "messages",:force => true do |t|
  2. t.integer :user_id
  3. t.string :subject
  4. t.string :body
  5. t.boolean :sent
  6. end

而这个模型就像:

  1. class Message < ActiveRecord::Base
  2. belongs_to :user
  3.  
  4. scope :sent,where(:sent => true)
  5. scope :received,where(:sent => false)
  6.  
  7. end

而在用户中:

  1. class User
  2. has_many :messages
  3. end

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

  1. user.messages.sent

和收到的消息

  1. user.messages.received

发送消息确实变得复杂得多:

  1. class Message
  2.  
  3. def send_message(from,recipients)
  4. recipients.each do |recipient|
  5. msg = self.clone
  6. msg.sent = false
  7. msg.user_id = recipient
  8. msg.save
  9. end
  10. self.update_attributes :user_id => from.id,:sent => true
  11. end
  12. end

或沿着这些方向的东西:您复制邮件并将其附加到所有收件人,最后将原始邮件发送给发送的邮件.

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

可能的改进:

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

希望这可以帮助.

猜你在找的Ruby相关文章