嘿 我正在尝试实现社交网络中使用的消息系统。我面临的问题首先是数据库结构,第二是如何在rails中实现它 我的第一个想法是我正在使用3个表:
消息:id | subject | text | created_at
receiver:id | message_id | read:boolean
creators:id | message_id | read:boolean
现在我想知道如何实现以下功能:
1.)用户可以删除他的消息。但是,由于两者都想阅读邮件,如何确保仅在两个用户删除邮件时删除邮件
2.)我如何实施回复?或者实际上如何找到相应的创作者?
3.)如何确定接收方是否读取了邮件?
另一个想法是: creator_messages:id | creator_id | receiver_id | subject | text | read | created_at receiver_messages:与creator_messages相同
这区分了用户,因此他们可以单独删除他们的消息。但我怎么知道邮件是否被阅读?
我的第三种方法基本上是我的第二种方法,但只有一种表消息,然后将其显示给用户 1.一旦用户删除了该消息,该消息就被删除 2.实际上,我如何将这些关系表示为has_many并属于?
我认为它会像这样工作:
model User
:has_many :send_messages, :class_name=>"messages", :foreign_key=>"creator_id"
:has_many :received_messages, :class_name=>"messages", :foreign_key=>"receiver_id"
end
model Messages
belongs_to :user
end
但不知怎的,我没有让它发挥作用。我想我错过了一些基本的东西。
希望有人可以帮助我=)非常感谢
答案 0 :(得分:1)
我只创建一个消息模型,这将有额外的字段 - receiver_read - receiver_deleted - sender_deleted
现在您可以在模型中添加钩子,例如“after_save”,“after_create”,您可以通过例如receiver_read_changed来检查receiver_read是否刚刚设置为true?方法,如果这是真的,您可以通知发件人或使用它做其他事情。 使用此after_save挂钩,您还可以检查如果sender_deleted刚刚设置为true且receiver_deleted已经为true,则删除整个消息。
当你有多个接收器时,我会为接收器创建一个连接模型,并在消息模型中有sender_deleted和sender_id。 在连接模型中,我将添加列receiver_id,读取和删除。 现在我将在消息和连接模型上使用before_save方法来检查是否需要删除邮件,或者是否必须通知发件人已阅读的邮件。
答案 1 :(得分:0)
解决方案可能是:
1)我也会在接收器表中创建一个删除的(_at)标志,如果你真的想要删除数据库中的消息,如果所有接收者都删除了它,你可以设置一个cronjob或者什么。 / p>
2)在消息模型中有一个creator_id而不是创建者表,我的意思是多个人如何创建相同的消息?
3)我真的没有得到这个,我猜你在用户打开邮件时将接收器表上的“read”标志设置为“true”,之后你可以在用户模型中创建一个范围比如“scope:read,where(:read,true)”以及范围未读。
我希望这就是你的意思。