Ruby On Rails分层关系建模

时间:2011-02-22 00:13:16

标签: ruby-on-rails inheritance single-table-inheritance

我有一个名为users的基表,其中包含有关用户的所有常用信息,例如姓名,地址,电话号码等。

我有另一个名为clients的表,它包含有关客户端的特定信息(例如客户端的公司名称及其URL),并从users表继承用户信息。客户端有一个外键user_id,它映射回用户的信息。

我有另一个名为client_admins的表,它包含有关client_admins的特定信息,还有一个user_id字段和一个client_id字段(链接到clients表)。

我有另一个名为super_admins的表,它链接到users表,并提供有关超级管理员的特定信息。

我知道我可能会逃脱单表继承,因为每种类型之间没有很多不同的数据,只有不同的功能和特权。

在Rails 3中对此进行建模的最佳方法是什么?

2 个答案:

答案 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更好的唯一字段,但也共享方法和属性,如正常继承。

查看 - http://peterhamilton.github.com/citier/