【问题标题】:Rails4 - Devise - User can generates Partners, Partners are User ClassRails 4 - 设计 - 用户可以生成合作伙伴,合作伙伴是用户类
【发布时间】:2014-08-12 10:30:31
【问题描述】:

我正在使用 rails 4 和 Devise 身份验证。

用户注册只需要电子邮件,然后,在电子邮件验证后,要求填写用户名、名字、姓氏和密码。

用户拥有(拥有)团队,他可以在其中添加合作伙伴。

合作伙伴是用户类,因为他们共享相同的属性。

这是一个非常简单的逻辑,但由于 Devise 单独做了很多操作,我想知道这是否是正确的做法,我的意思是为用户和合作伙伴共享用户模型,而不是拥有一个专用模型每个人。

举个例子,我有这些敏感的想法:

我如何“自动激活”我的合作伙伴,即覆盖设计激活过程?

--> 合作伙伴将在应用内立即可见

--> 显然不允许合作伙伴登录

后期逻辑:

稍后,如果用户尝试注册并且他的电子邮件已经存在于数据库中,它将:

--> 检查用户状态

---->如果是合作伙伴,则创建一个状态为“用户”的新帐户

---->如果是用户,将通过电子邮件发送密码提醒

关于逻辑的更多信息

团队所有者的用户(= 注册用户)的状态为“用户” 生成的用户,称为合作伙伴,将具有“合作伙伴”状态,但来自用户类

因此,一个用户将能够创建多个合作伙伴,并且这些合作伙伴可能拥有相同的电子邮件(假设他们不在同一个团队中)。 我可以用 find 或 create 解决这个重复问题,因为所有合作伙伴都是由同一个用户创建的。

现在,假设许多用户都有共同的合作伙伴。 User1创建partner@gmail.com,User2创建partner@gmail.com 在这里,Devise 将提出否决权并创建区块。

我为什么要为每个人保留合作伙伴,以及我为什么要保留 使用相同电子邮件的合作伙伴和用户?

--> 合作伙伴有个人资料。我希望用户能够为合作伙伴创建他想要的个人资料(头像等)。

--> 合作伙伴可以在不同的团队中以不同的职业(比如四分卫或类似的职业)行事,因此每个用户都可以为独特的 partner@email.com 创建自己的个人资料

--> 如果用户注册(成为所有者,一种官方资料),并且作为合作伙伴出现在几个团队中,那么团队的所有者将被要求从一个他创造了“官方”

我同意,这有点复杂。

目前,我将“所有者”状态存储在用户模型的专用行中。 我有一张卡和合作伙伴之间多对多关系的连接表。 这样,如果用户要求,我可以轻松地用他的新“官方配置文件”ID 更新 partner_id,然后删除用户模型中“非官方”配置文件的行

我的问题实际上是设计具有角色的身份验证以阻止合作伙伴登录尝试(这部分在下面回答)和电子邮件唯一性。

我希望我的解释是清楚的,我为我糟糕的英语道歉。

非常感谢您。

亲切的问候

【问题讨论】:

  • 根据您的更新,我觉得需要几个模型来保持独立并避免不必要的逻辑。

标签: ruby-on-rails ruby-on-rails-4 devise polymorphism


【解决方案1】:

您在此处提到的方法很好。您可以在同一个用户表中拥有合作伙伴和用户。据我了解user has_many teams and team belongs_to user .用户将是团队的所有者或合作伙伴。

所以当用户添加合作伙伴时,只需创建一个方法来处理用户创建。再多一张表,其中包含 user_id、team_id 和 user_role('user' 或 'partner')

假设使用的db是sql,

    class Team < ActiveRecord::Base
      has_many :teams_users
      has_many :users, :through => :team_users
    end

    class TeamUsers < ActiveRecord::Base
      belongs_to :team
      belongs_to :user
    end

    class User < ActiveRecord::Base
      has_many :teams_users
      has_many :teams, :through => :teams_users
    end

Devise 需要密码,因此您可以从服务器端设置密码和密码确认。不要向用户发送邮件,因为您想避免默认的设计认证方式。 Devise 将 Confirmed_at 存储在用户属性中,该属性设置了用户单击确认链接时的时间戳。 Update this confirmed_at 在添加用户时直接从后端或根据您的要求从后端。注册合作伙伴的电子邮件 ID、设置密码并确认可用后,合作伙伴帐户即处于活动状态。

当用户尝试以合作伙伴或用户的身份注册/登录时,让我们看看第二部分。要处理此问题,请更改用户的登录行为。当用户尝试注册时,继承设计控制器并从 users_team 表中检查用户角色。有一个更清晰的想法,如果用户在两个不同的团队中拥有两个角色,将会感到困惑。

此外,即使用户状态为合作伙伴,也不应创建新帐户,因为默认情况下设计认为电子邮件 ID 是唯一的,并且用户对象已创建,除非您尝试更改此设置。在这两种情况下发送密码提醒看起来都不错,您仍然可以根据应用程序需要处理功能。

【讨论】:

  • 非常感谢您提供的所有这些信息,这非常有帮助。我将在问题中添加有关完整使用此双重配置文件的信息(为了便于阅读),因为在我的假设逻辑中不是唯一的电子邮件似乎有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
  • 1970-01-01
  • 2019-01-02
  • 2013-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多