我拥有多个帐户,每个帐户都有自己的用户,并希望用户的电子邮件地址只对每个帐户唯一

时间:2010-10-23 11:56:27

标签: ruby-on-rails subdomain devise accounts subdomain-fu

我使用rails构建一个网络应用程序,为每个企业提供自己的帐户和子域名,类似于basecamp(以及其他37个信号应用程序)lighthouseapp.com等等。

现在我知道有很多关于如何在rails中执行子域的教程,甚至是subdomain-fu插件。

问题是我想使用用户的电子邮件地址作为登录,这意味着它必须是唯一的,但我只希望它对每个帐户而不是所有帐户都是唯一的。

我正在使用设计进行身份验证,我创建了一个代表帐户的“帐户”模型,以及一个代表该帐户用户的用户模型。 Devise对用户模型进行操作,看起来它需要每个用户都有一个唯一的电子邮件地址。

我是否清楚地说明了这个问题?我很乐意提供澄清。

有人能指出我正确的方向吗?


澄清Tim的一些细节

  • 问:一个人可以有多少账户 生意有吗?
  • 答:每个企业都有一个帐户。例如“斯普林菲尔德数学研究”

  • 问:子域和帐户之间是否存在一对一的关联?

  • 答:可以,例如springfield-maths-grinds.myapp.com

  • 问:“用户”是对应于自然人还是帐户中的角色?

  • 答:我应该更好地解释一下。我实际上有两个单独的模型,例如导师和学生。每个帐户都有多个导师和学生。

商家,帐户,子域 商业&帐户实际上是一回事。可以说是“商业帐户”。 我使用子域名访问每个“商家帐户”

登录,用户,电子邮件地址 我应该澄清一下,我有两种类型的用户,由不同的模型代表,这些是导师和学生。这些将需要登录到应用程序,我想使用电子邮件地址作为他们的登录,而不是用户名。

希望能够解决问题,而不是让事情变得更糟。

我的实际问题如下, 如果有人要为“斯普林菲尔德物理研磨”设置一个商业帐户,并且其中一个“斯普林菲尔德数学研究”的学生试图注册,那么他们将无法这样做,因为电子邮件地址已经在使用并且需要独一无二。我想知道如何在商业帐户中确定学生和导师的范围。

2 个答案:

答案 0 :(得分:1)

您需要考虑两件事。数据完整性和身份验证。

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'

我假设您正在使用Rails 3.如果您使用的是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

答案 1 :(得分:0)

我认为你需要对你正在做的事情以及你所要求的事情有所了解。重要的是解释您的需求和数据模型,而不是您正在使用的包。在你的问题中,我们有:

  • 企业
  • 帐户
  • 子域
  • 登录
  • 用户
  • 电子邮件地址

我猜其中一些是同样的事情。所以也许你可以先概括一下这些东西是如何组合在一起的。以下是一些问题:

  • 个别企业可以拥有多少个帐户?
  • 子域和帐户之间是否存在一对一的关联?
  • “用户”是否与自然人或帐户中的角色相对应?

一旦你清楚地意识到这些事情是如何结合在一起的,并且你可以清楚地说明这一点,那么你的问题将更容易回答。

相关问题