我有一个rails应用程序,它有三种不同类型的用户,我需要它们共享相同的常用配置文件信息。但是,每个不同的用户本身也具有独特的属性。我不确定如何区分不同的领域。Rails Active Record - 如何建模用户/配置文件场景
- 管理员(网站管理员宽)(/商店的等)
- 所有者
- 会员(如合作社的成员)
我使用色器件认证和cancan授权。因此,我有一个用户模型,其中包含可应用于用户的一组角色。这个类看起来这样:
class User < ActiveRecord::Base
# ... devise stuff omitted for brevity ...
# Roles association
has_many :assignments
has_many :roles, :through => :assignments
# For cancan: https://github.com/ryanb/cancan/wiki/Separate-Role-Model
def has_role?(role_sym)
roles.any? { |r| r.name.underscore.to_sym == role_sym }
end
end
每个用户都拥有包括个人资料:
- 首先&姓
- 地址信息(城市/ ST/ZIP /等)
- 电话
我不想用这个信息污染User模型,所以我把它扔到Profile模型中。这部分相当简单。这会把用户模型弄成这个样子:
class User < ActiveRecord::Base
# ... devise stuff omitted for brevity ...
# ... cancan stuff omitted for brevity ...
has_one :profile
end
的附加字段是我对如何模型有一些忐忑不安的心情......
如果用户是管理员,他们将有独特的领域,如:
- admin_field_a:字符串
- admin_field_b:字符串
- 等
如果用户是所有者,他们将有独特的领域...
- stripe_api_key:字符串
- stripe_test_api_key:字符串
- stripe_account_number:字符串
- HAS_ONE:商店#AR Refence到管理员和成员没有的另一种模式。
如果用户是一个成员,他们将有一些额外的领域,例如:
- stripe_account_number:字符串
- belongs_to的:商店#商店,他们是
- 成员has_many:note
...
并且Store模型将在成员中包含has_many,因此我们将处理该商店的成员。
问题在于附加字段。我是否将这些设置为不同的类?把它们放在一个不同的 我目前尝试了几种不同的方法来设置它:
一种方法是建立用户模型作为聚合根
class User < ActiveRecord::Base
# ...
# Roles association
has_many :assignments
has_many :roles, :through => :assignments
# Profile and other object types
has_one :profile
has_one :admin
has_one :owner
has_one :member
# ...
end
这种方法的好处是用户模型是根,可以访问所有内容。如果用户是“所有者”,那么“管理员”和“成员”引用将为零(以及其他可能性的管理员 - 管理员而不是所有者或成员等)。
我在想的另一种选择是让从用户模型,这样用户继承的每种类型:
class User < ActiveRecord::Base
# ... other code removed for brevity
has_one :profile
end
class Admin < User
# admin fields
end
class Owner < User
# owner fields
end
class Member < User
# member fields
end
问题的,这是我正在污染User对象有各类零年代在一个类型不需要另一个类型/等的值的表中。看起来很混乱,但我不确定。
另一种选择是将每个帐户类型创建为根,但将用户作为子对象,如下所示。
class Admin
has_one :user
# admin fields go here.
end
class Owner
has_one :user
# owner fields go here.
end
class Member
has_one :user
# member fields go here.
end
与上面的是我不知道如何加载,一旦用户登录正确的类中的问题。我有自己的USER_ID,我就可以告诉他们是哪个角色(由于用户模型中的角色关联),但我不确定如何从用户UP转到根对象。方法?其他?
结论 我有一些不同的方法可以做到这一点,但我不知道正确的“轨”的方法是什么。在rails AR中对此进行建模的正确方法是什么? (MySQL后端)。如果没有一个“正确”的方法,上面最好的是什么(我也接受其他想法)。
谢谢!
这就是我的答案“标记为”这工作“,因为当我测试它时,它工作得很好。谢谢你非常深思熟虑和详细的回应Jeffrey。:)然而,经过与Michael Hartl(RailsTutorial.org)咨询了一些MVP可行的产品)的东西,我决定把所有的配置文件数据放入用户模型,以简化与模型的交互。如果MVP证明是成功的是有利可图的,那我稍后可以解决这个问题。 – 2012-04-04 16:26:44