[英]I have multiple accounts each its own users, and want the users email address to only be unique per account
我正在使用Rails构建一个Web应用程序,为每个企业提供自己的帐户和子域,类似于basecamp(以及其他37个信号应用程序)lighthouseapp.com的运行方式,等等。
现在,我知道有很多不错的教程,介绍了如何在Rails中创建子域,甚至还有subdomain-fu插件。
事实是,我想使用用户的电子邮件地址作为他们的登录名,这意味着它必须是唯一的,但是我只希望每个帐户(而不是所有帐户)都唯一。
我正在使用devise进行身份验证,并且创建了一个代表帐户的“帐户”模型和一个代表该帐户的用户的用户模型。 Devise在用户模型上运行,并且似乎要求每个用户都有一个唯一的电子邮件地址。
我已经足够清楚地陈述了这个问题吗? 我很高兴提供澄清。
谁能指出我正确的方向?
答:每个单独的企业都有一个帐户。 例如“ Springfield Maths Grinds”
问:子域和帐户之间是否存在一对一的关联?
答:是的,例如springfield-maths-grinds.myapp.com
问:“用户”对应于自然人还是帐户中的角色?
商业,帐户,子域商业和帐户实际上是同一回事。 可以说是一个“企业帐户”。 我正在使用子域来访问每个“企业帐户”
登录名,用户,电子邮件地址我应该澄清一下,我有两种类型的用户,分别由不同的模型表示,分别是导师和学生。 这些将需要登录到应用程序,我想使用电子邮件地址代替他们的用户名。
希望这可以使事情变得清晰,而不是变得更糟。
我的实际问题是,如果有人要为“ Springfield物理研磨”设置一个企业帐户,并且“ Springfield数学研磨”的一名学生试图注册,那么他们将无法这样做,因为该电子邮件地址已经在使用中并且需要唯一。 我想知道如何在一个商业帐户中确定学生和导师的范围。
您需要考虑两件事。 数据完整性和认证。
Rails使您可以将唯一性的范围限定为一个或多个列。 通过作用域,您可以在数据库中有多个foo@bar.local电子邮件地址,每个帐户只能有一个限制。 我已经包括了相应的SQL可能看起来是什么,以演示其工作原理。
# Without scoping
validates :email, :uniqueness => true
SELECT 1 FROM `users` WHERE `users`.email = 'foo@bar.local'
# With scoping
validates :email, :uniqueness => true, :scope => :account_id
SELECT 1 FROM `users` WHERE `users`.account_id = 1 AND `users`.email = 'foo@bar.local'
我假设您使用的是Rails3。如果您使用的是Rails 2,则可以将相同的选项传递给validates_uniqueness_of
。
为了进行身份验证,您需要找到该帐户,确保该用户属于该帐户,并检查其密码是否匹配。 当您向用户提供登录表单时,您已经知道他们使用哪个帐户进行身份验证。 您的操作可能如下所示。
def create
@account = Account.find_by_subdomain(params[:subdomain])
@user = @account.users.find_by_email(params[:user][:email])
if @user.authenticate(params[:user][:password])
redirect_to dashboard_path
else
render :new
end
end
我认为您需要对自己正在做的事情和确切的要求有所了解。 首先重要的是解释您的需求和数据模型,而不是您使用的程序包。 在您的问题中,我们有:
我猜其中有些是一样的。 因此,也许您可以首先概述这些东西如何组合在一起。 这里有一些问题:
一旦您清楚地知道这些东西是如何组合在一起的,并且可以明确说明,您的问题就会很容易回答。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.