我有一个名为users的基表,其中包含有关用户的所有常用信息,例如姓名,地址,电话号码等。
我有另一个名为clients的表,它包含有关客户端的特定信息(例如客户端的公司名称及其URL),并从users表继承用户信息。客户端有一个外键user_id,它映射回用户的信息。
我有另一个名为client_admins的表,它包含有关client_admins的特定信息,还有一个user_id字段和一个client_id字段(链接到clients表)。
我有另一个名为super_admins的表,它链接到users表,并提供有关超级管理员的特定信息。
我知道我可能会逃脱单表继承,因为每种类型之间没有很多不同的数据,只有不同的功能和特权。
在Rails 3中对此进行建模的最佳方法是什么?
答案 0 :(得分:2)
在您的用户模型中:
has_one :client
has_one :client_admin
has_one :super_admin
在您的客户端模型中:
belongs_to :user
has_one :client_admin
在client_admin模型中:
belongs_to :user
belongs_to :client
在super_admin模型中:
belongs_to :user
答案 1 :(得分:0)
我不确定这是否与您的目标完全相同,但是我的Citier gem可以做到这一点:
class User < ActiveRecord::Base
acts_as_citier
# User methods and validation, inherited by all children (so client & super admins)
# Useful for things like validating user permissions etc
end
class Admin < User
acts_as_citier
# Admin specific methods and validation, inherited by all children
end
class Client < ActiveRecord::Base
end
class ClientAdmin < Admin
acts_as_citier
belongs_to :client
# Client admin specific methods and validation
end
class SuperAdmin < Admin
acts_as_citier
# Super admin specific methods and validation
end
允许每个模型具有比STI更好的唯一字段,但也共享方法和属性,如正常继承。