在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将为空,但消息将保持不变。