使用Authlogic验证多个模型

时间:2010-02-16 21:19:12

标签: ruby-on-rails database-design authlogic

我有多种用户帐户类型,每种类型都有不同的信息。例如,业务联系人链接到企业,学校管理员和学生链接到学校。学生有实际地址,但业务联系人和学校管理员使用组织地址。还有其他每种类型的信息。

我倾向于为学生,学校管理员和业务联系人提供单独的表格,但是使用Authlogic,我有一个带有身份验证信息的Users表(都需要登录)。

问题是如何最好地将此单一身份验证表与各个配置文件相关联。似乎一对一的关系需要单个表格(例如,用户< - >学生用户< - > Business_contacts)。我想要一些“一对一”的关系(用户< - > Students Business_contacts)。有没有一种使用连接表或其他构造的好方法?

或者,我可以统一Users表中的公共信息,并在XML中提供“profile”列以支持唯一信息。我的想法是将所有内容保存在干净的DB列中会简化选择/插入。

思想,想法?

2 个答案:

答案 0 :(得分:5)

  

业务联系人链接到企业,学校管理员和学生链接到学校。

这意味着您拥有不同的角色用户,而不是不同的用户。

  

学生有实际地址,但业务联系人和学校管理员使用组织地址   还有其他每种类型的信息。

这意味着不同的角色具有不同的数据和行为,导致不同的OO类

  

问题是如何最好地将此单一身份验证表与各个配置文件相关联。   我想要一些“一对一的”关系(用户< - > Students或Business_contacts)。有没有一种使用连接表或其他构造的好方法?

我能想到的最简单的模型如果以下内容:

  • User(用户名,电子邮件,密码,姓名和其他每个用户的常用数据
  • Participant,摘要。 (与一个用户的关系 - 定义参与者的角色,行为及其常见数据)。应该为参与者提供界面。
  • Student(继承自参与者,添加自己的行为和数据)
  • SchoolAdministrator(继承自参与者)
  • 等等

在面向对象的世界(非RDBMS)中,这有一个简单的优势:多态。拥有一个用户,你不需要确切地知道他是谁。你只需要这样做:

user.participant.can_manage_stuff?
user.participant.order_book(harry_potter)

将会执行相应的操作,这些操作将在StudentSchoolAdministrator或从Participant继承的其他类中实施。
另一件事是系统非常轻松添加新角色。只需继承Participant并实现其界面。

现在,当面向对象设计完成后,让我们查看数据存储。我假设您使用RDBMS。

所以现在你有两种类型的链接:

  1. UserParticipant之间的一对一关联。
  2. 广义(继承)ParticipantStudent之间,SchoolAdministrator
  3. 1st的实现就像下表中的has_one和/或belongs_to关联一样简单(通过participant_id列):

      

    用户:      id |用户名|电子邮件|密码|等| participant_id (非空)FK_TO_participants表|

    所以你可以很容易地实现它。

    现在,第二个链接可以在RDBMS中实现,数量为different wasy

    但幸运或遗憾的是 ActiveRecord只支持一个选项来做到这一点。并且层次结构每个映射策略使用 discriminator 列来区分类型(按照约定存储在type列中)。

    所以你会得到第二个看起来像这样的表:

      

    perticipants:      id | 输入 | student_card_number(null)| administrator_number(null)|等

    此表格包含所有可能参与者的所有列。这是DB中最简单,最简单的层次结构实现。但从某些观点来看,这不是最优的。正如我在ActiveRecords中所说,无论如何它只有一个选项。

    因此,在此设计的结果中,您将最终得到2个数据库表(用户,参与者)和至少3个类(用户,参与者,学生)。

    当然,你可以在这里做出很多改变,但这应该是我的观点。

    是的,请不要在数据库中使用XML,不要浪费你的神经和宝贵的个人时间。

    干杯。

答案 1 :(得分:3)

如果您确实需要为您使用的每个角色分别使用模型,那么我建议使用多态关联(read more here)。所以:

# User model
belongs_to :owner, :polymorphic => true

# Student model
has_one :user, :as => :owner

# Any other model
has_one :user, :as => :owner

您需要添加到用户表:

 t.integer :owner_id
 t.string  :owner_type