Rails私人消息系统

时间:2011-02-24 09:41:13

标签: ruby-on-rails messagebox database-schema has-many

嘿 我正在尝试实现社交网络中使用的消息系统。我面临的问题首先是数据库结构,第二是如何在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

但不知怎的,我没有让它发挥作用。我想我错过了一些基本的东西。

希望有人可以帮助我=)非常感谢

2 个答案:

答案 0 :(得分:1)

好吧,如果我理解正确的话,这些消息最多只有1个接收者和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)”以及范围未读。

我希望这就是你的意思。