如何使用ActiveRecord存储/模拟用户/facebook用户/linkedin用户等?

如何使用ActiveRecord存储/模拟用户/facebook用户/linkedin用户等?,activerecord,data-modeling,Activerecord,Data Modeling,我的应用程序 “普通”用户:通过典型注册页面访问的用户 facebook(FB)用户:来自facebook connect的用户 “FB普通”用户:可以同时使用电子邮件/密码*FB connect登录的用户 此外,还有一系列其他openID登录方法(我认为openID本身是不可接受的,因为它不连接帐户,也不允许第三方特定功能(发布到twitter,添加FB帖子等)) 那么,我该如何建模呢 现在我们有了“facebook用户”的用户类?定义的——但是对于“FB普通”用户来说,它变得很混乱——加

我的应用程序

  • “普通”用户:通过典型注册页面访问的用户
  • facebook(FB)用户:来自facebook connect的用户
  • “FB普通”用户:可以同时使用电子邮件/密码*FB connect登录的用户
此外,还有一系列其他openID登录方法(我认为openID本身是不可接受的,因为它不连接帐户,也不允许第三方特定功能(发布到twitter,添加FB帖子等))

那么,我该如何建模呢

现在我们有了“facebook用户”的用户类?定义的——但是对于“FB普通”用户来说,它变得很混乱——加上所有的验证都变得非常棘手和难以解释。还有一些方法,如#传递#密码#重置!这对于只有facebook的用户来说毫无意义。(这太差劲了)

我想到了STI(用户::Facebook、用户::Normal、用户::FBNormal等),这使得验证super光滑,但它不能扩展到其他连接类型,以及它们之间的所有排列。。。用户::FacebookLinkedInNormal(wtf?)用一堆模块做这件事,我认为会很糟糕


还有其他想法吗?

你遇到了地雷

Facebook和LinkedIn都通过使用非关系型的键/值存储来解决这个问题。Facebook使用,LinkedIn使用

如果不受关系模型约定的约束(例如,给定表的所有行都有相同的列),则可以获得更大的灵活性并改变每行的属性。但这样做会牺牲关系模型的一些优点(例如,给定表的所有行都有相同的列)


在RDBMS中,我将使用来构建它。

您正在遇到这些地雷之一

Facebook和LinkedIn都通过使用非关系型的键/值存储来解决这个问题。Facebook使用,LinkedIn使用

如果不受关系模型约定的约束(例如,给定表的所有行都有相同的列),则可以获得更大的灵活性并改变每行的属性。但这样做会牺牲关系模型的一些优点(例如,给定表的所有行都有相同的列)


在RDBMS中,我将使用来构建它。

我将分解关注点,似乎在一个表中保留具有截然不同字段的记录是没有意义的

只要有一个不保存任何凭据的用户模型/表,并使其与帐户/登录方法具有多个关系,您可以使用STI对不同类型进行建模

class User < AR::B
  has_many :accounts
end

class Account < AR::B;end

class PasswordAccount < Account;end 

class GoogleAccount < Account;end

class FacebookAccount < Account;end

…
类用户
我会将关注点分开,似乎在一个表中保留字段差异很大的记录是没有意义的

只要有一个不保存任何凭据的用户模型/表,并使其与帐户/登录方法具有多个关系,您可以使用STI对不同类型进行建模

class User < AR::B
  has_many :accounts
end

class Account < AR::B;end

class PasswordAccount < Account;end 

class GoogleAccount < Account;end

class FacebookAccount < Account;end

…
类用户