【问题标题】:Rails private message systemRails 私信系统
【发布时间】:2011-02-24 09:41:13
【问题描述】:

嘿, 我正在尝试实现社交网络中使用的消息系统。我面临的问题首先是关于数据库结构,其次是如何在 Rails 中实现它。
我的第一个想法是我使用 3 个表:

消息:id|subject|text|created_at
接收者:id|message_id|read:boolean
创建者: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

但不知何故我没有让它工作。我想我在这里遗漏了一些基本的东西。

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

【问题讨论】:

  • 应该是:sent_messages,如果另一个是:received_messages :)
  • 我没有尝试设置私人消息系统,但如果我必须这样做,我会挖掘 insoshi 代码(github.com/insoshi/insoshi)或检查这个插件:github.com/professionalnerd/simple-private-messages(工作使用 Restful 身份验证)。希望它可以帮助...
  • 嘿,为什么你想要消息的多个创建者,而不仅仅是消息模型中的 creator_id?
  • 我会挖掘代码谢谢。

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


【解决方案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 方法来检查是否需要删除消息,或者是否必须通知发件人已阅读的消息。

【讨论】:

    【解决方案2】:

    解决办法可能是:

    1)我也会在接收者表中创建一个已删除(_at)标志,如果你真的想从数据库中硬删除消息,如果所有接收者都删除了它,你可以设置一个 cronjob 或其他东西。

    2) 在消息模型中有一个 creator_id 而不是 creators 表,我的意思是多个人如何创建相同的消息?

    3)我真的不明白这个,我猜你在用户打开消息时将接收者表上的“读取”标志设置为“真”,之后你可以在用户模型中创建一个范围比如 "scope :read, where(:read, true)" 和一个未读的范围。

    我希望这就是你的意思。

    【讨论】:

    • 1) 只有一个接收者,但只有在双方都决定删除它时才能删除该消息 2) 至少对于第一种方法是这样 3) 是的,我设置了 readflag,但是我如何通知创建者该消息已被阅读?
    猜你喜欢
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 2012-09-09
    • 2018-07-18
    • 1970-01-01
    相关资源
    最近更新 更多