【问题标题】:Ruby models, should I choose Inheritance or just associationsRuby 模型,我应该选择继承还是只选择关联
【发布时间】:2011-12-01 17:17:42
【问题描述】:

我有以下表格和字段

 User   :username,:password,:email

 Organiser  :organiser_specific_fields

 Participant  :participant_specific_fields

组织者和参与者都是用户,

用户已经存在于系统中,

当一个用户组织一个聚会时,我创建一个聚会类的实例,将他添加为该聚会的组织者,并将其他用户添加为参与者。

如何在 Rails 中建模?考虑到系统中已经存在用户,我无法弄清楚在 Rails 中实现此功能的最佳方法是什么。

【问题讨论】:

  • 组织者和参与者的特定字段是否与给定的聚会相关? (例如“参加(是/否)”、“带来松饼”、“制作烧烤酱”)
  • 是的,作为一方组织者的用户也可以成为另一方的参与者

标签: ruby-on-rails ruby-on-rails-3


【解决方案1】:

根据您的 cmets,我建议您坚持以下架构:

  1. 用户表,保存有关用户的所有详细信息(名字、姓氏)
  2. 包含有关派对的所有详细信息(时间、地点……)的派对表
  3. 以下列出的模型的两个连接表:

此代码未经测试,可能需要对名称进行一些调整:

class User < ActiveRecord::Base
    has_many :parties, :through => :participations, :source => :user
    has_many :organised, :through => :organises, :source => :user
end

class Party < ActiveRecord::Base
    has_many :participants, :through => :participations
    has_many :organizers, :through => :organises
end

class Participation < ActiveRecord::Base
   belongs_to :user
   belongs_to :party
   # this class represents "a user is going to a party"
   # additional fields, which are specific to a participation go here as well
end

class Organises < ActiveRecord::Base
    belongs_to :user
    belongs_to :party
    # This class represents "user is the organisator of a party"
    # additional fields, which are specific to organizing a party go here
end

优点:

  • 您无需触摸用户表
  • 一个聚会可以有两个或多个组织者
  • 聚会的组织者也可以参加聚会(希望如此)
  • 您的数据库中没有数据重复

缺点:

  • 您必须自己管理关联:用户不得两次去(或成为组织者)同一聚会的人

我希望这有助于澄清一些事情。更多信息可以在 link 的 rails 文档中找到。

【讨论】:

    【解决方案2】:

    取决于每个字段有多少个特定字段,以及您的用户表在这些附加字段中看起来有多糟糕。如果 Organizer 和 Participant 不是数据库中的独立实体,那么它们可能只是 mixins!

    但一般来说,恕我直言,绝对是继承。

    【讨论】:

    • 他们将为组织者和参与者提供 2 个特定字段。如果我需要使用 STInheritance,您能否将我链接到一个好的页面以了解它:-)
    • rails doc 很好。只需查找“单表继承”.. HTH!
    猜你喜欢
    • 2011-06-21
    • 2015-03-12
    • 1970-01-01
    • 2015-09-15
    • 2010-12-25
    • 1970-01-01
    • 2016-03-19
    • 2010-12-08
    相关资源
    最近更新 更多