【问题标题】:Ruby On Rails Hierarchical Relationship ModelingRuby On Rails 层次关系建模
【发布时间】:2011-02-22 00:13:15
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    在您的用户模型中:

    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
    

    【讨论】:

    • 谢谢!在用户模型的情况下,是否可以有一个可选的 has_one 关系?
    • 您的意思是,就像您只想将belongs_to 放在包含外键的模型中,而将has_one 部分留给另一个模型?
    • 好吧,我只是说用户只会与客户端、client_admin 或 super_admin 相关。那么用户模型是否关心它没有所有的关系?
    • 我已经读过几次了,我认为我的关系是正确的。你可以把我的关系想象成一个简单的表继承模型。 Patient、Client、SuperAdmin 和 ClientAdmin 都从 users 表继承了相似的信息,并且“子”表具有每个子类型的特定信息。至少从数据库的角度来看是否有意义?
    • @Chris:当然有道理!这正是它应该做的!
    【解决方案2】:

    我不确定这是否正是您的目标,但使用我的 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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多