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
这是一个很好的问题!我会建模,以尽可能地与电子邮件模型进行比较.因此,消息始终属于单个用户,并且已发送或接收.
简而言之:
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)
或者类似的东西:你复制邮件并将其附加到所有收件人,最后使原始邮件成为发送的邮件.
这样每个用户都可以完全控制消息.
可能的改进:
希望这可以帮助.
| 归档时间: |
|
| 查看次数: |
3086 次 |
| 最近记录: |