我有一个用户模型,对于登录和注册,它的电子邮件字段被使用(所有来自设计宝石的香草)。
我希望(其他)用户能够例如将用户添加到团队中,并使用电子邮件地址作为标识符。
用户已经存在(伪@team.users.add(User.find_by(email: other_users_email))
)时没问题,但我不确定如何处理用户尚不存在的情况(尚未注册) 。
当(新)用户设置新帐户时,对于上述示例,成功注册后current_user.teams
应正确显示。
我不想强迫这些潜在的新用户使用系统(例如使用devise_invitable)并使用电子邮件打扰他们。
当我使用给定电子邮件的用户尚不存在时,我遵循了创建用户的路径,但是当用户实际尝试设置帐户时,它失败了(电子邮件不是唯一的)。
或者,我可以对TeamMember部分进行改造,并可选择存储电子邮件地址或对现有用户的引用。那么我需要的是在用户帐户创建后直接检查“开放”的TeamMembers(因此,TeamMembers使用给定的电子邮件)。我也可以在每次请求时这样做,但这看起来对我来说太贵了。可能存在竞争条件,但我可以忍受这种情况(并且通过cron-job检查每个现在在千分之一的差距。)
任何指针?我确信这不是那么不寻常。
答案 0 :(得分:0)
我会这样做:
当用户A通过电子邮件将用户B添加到团队时,为该用户B创建对象,但设置一个标记,如auto_created_and_inactive: true
当用户B在网站上注册时,您只需在users#create
中处理此问题:首先,尝试查找自动创建的记录并更新它(设置密码或其他内容;还要重置标记) )。或以其他方式继续创建新记录的通常路线。
答案 1 :(得分:0)
我不得不承认我还没有尝试@ sergio-tulentsevs方法(实现RegistrationController #create)。但要完成我在问题中草拟的内容:
User
模型可以定义after_confirmation
方法,该方法在...确认后调用!因此,如果我存储关于潜在用户的每个信息并引用他/她的电子邮件地址,则一旦他/她注册,我可以查询该信息,例如,完整的团队成员资格。
# app/models/user.rb
def after_confirmation
# (pseudo-code, did not try)
self.teams < TeamMembership.open.where(email: self.email)
end