0

我有一个应用程序,允许用户将任务分配给系统中的人。

一旦我输入“与 some_user@example.com 分享”,用户将收到一封电子邮件,我将不得不以某种方式说明我与该用户有待处理的友谊。

我的友谊表设置如下:

user_id:整数,friend_id:整数,状态:字符串

场景:添加好友 Steve 的 user_id = 2, fred 的 user_id = 6 当一个好友开始时,我在好友表中添加两行: (user_id,friend_id, status) (2, 6, requested) (6, 2, pending)

这涵盖了双方的友谊。

我的问题是,处理与尚未注册的用户的友谊的好习惯是什么。

到目前为止,我这样做的方式是将电子邮件置于状态(这对我来说感觉不对),并向受邀用户发送一个带有令牌的链接。当用户单击该链接时。他们将 url 中的令牌传递给注册页面。如果在注册时,我的控制器看到该令牌,我将在友谊表中搜索 Friendships.status = "invited_user@email.com" 并更新该记录以指向新创建的用户的 ID。

这对我来说感觉很脏(存储电子邮件地址并搜索它们)。

我刚刚想出的另一个解决方案是建立友谊的一面(user_id = 3,friend_id = null,status =“invited”)

并使用 query_string http://www.myapp.com/sign_up?invited_by=john@email.com发送邀请。

有了它,我可以通过电子邮件找到 john 的 id,找到 user_id = john.id AND status = "invite" 的朋友,并用我新创建的 user_id 更新它:公认”)

然后创建另一半的友谊:(user_id = 36,friend_id = john.id, status = "accepted")

没有在 url 中发送或嵌入混乱的令牌(只是通过电子邮件作为查询字符串邀请)。

如果一个用户有多个邀请,那并不重要,因为任何状态为“邀请”的记录都可以使用,因为我们还不知道被邀请用户的 ID。

有什么想法或更好的做法吗?

4

1 回答 1

1

我同意您的第一个解决方案不是最好的。很久很久以前就吸取了教训,不要在数据库字段方面发挥创造力。它们应仅用于一种目的且仅用于一种目的。(换句话说,不要将电子邮件存储在状态字段中。存储状态且仅存储状态。)

第二种解决方案似乎有效。

引入一个新实体怎么样?你会有用户和pending_users。两个不同的表,但您仍然可以在它们之间进行映射。

在某个时候,如果 pending_user 注册,他们可以成为“真实”用户并迁移到 users 表。

这是一个很好的自然分割,我想这会使查询更加直观——它会从 URL 中删除邀请的电子邮件。

于 2013-06-07T23:10:20.240 回答