Ruby on rails 3 Rails 3:我应该使用STI还是只使用一个额外的列?(征询意见)

Ruby on rails 3 Rails 3:我应该使用STI还是只使用一个额外的列?(征询意见),ruby-on-rails-3,polymorphism,sti,Ruby On Rails 3,Polymorphism,Sti,我正在从事一个项目(Rails 3.0.3),我认为我可能需要使用STI,但我不确定是否应该向表中添加一个额外的列并完成它 在我的对象模型中,(对于游戏系统),我有玩家(属于代理)和所有者(拥有代理) 玩家和所有者都由代理拥有,代理是一个用户帐户,因此代理可以是许多代理中的玩家和/或所有者 我应该将代理命名为“user”,而不是“oops”。所以我有这个: class Agency < ActiveRecord::Base has_many :players, :class_name

我正在从事一个项目(Rails 3.0.3),我认为我可能需要使用STI,但我不确定是否应该向表中添加一个额外的列并完成它

在我的对象模型中,(对于游戏系统),我有玩家(属于代理)和所有者(拥有代理)

玩家和所有者都由代理拥有,代理是一个用户帐户,因此代理可以是许多代理中的玩家和/或所有者

我应该将代理命名为“user”,而不是“oops”。所以我有这个:

class Agency < ActiveRecord::Base
  has_many :players, :class_name => "Player", :foreign_key => "agency_id"
  has_many :agents, :through => :players, :source => :agent_id
  has_one :owner, :class_name => "Owner", :foreign_key => "agency_id"
end

class Player < ActiveRecord::Base
  belongs_to :agency, :class_name => "Agency", :foreign_key => "agency_id"
  belongs_to :agent, :class_name => "Agent", :foreign_key => "agent_id"
end

class Owner < ActiveRecord::Base
  belongs_to :agency, :class_name => "Agency", :foreign_key => "agency_id"
  belongs_to :agent, :class_name => "Agent", :foreign_key => "agent_id"
end
classagency“玩家”,:foreign\u key=>“机构id”
有很多:代理,:通过=>:players,:source=>:agent\u id
拥有一个:所有者,:类名称=>“所有者”,:外键=>“代理id”
结束
类播放器“机构”,:外键=>“机构id”
属于\u to:agent,:class\u name=>“agent”,:foreign\u key=>“agent\u id”
结束
类所有者“机构”,:外键=>“机构id”
属于\u to:agent,:class\u name=>“agent”,:foreign\u key=>“agent\u id”
结束
玩家和所有者拥有完全相同的属性,两者之间的唯一区别是所有者与代理的关系不同于玩家(所有者拥有代理,代理只有一个所有者,但有许多玩家)

此外,所有者还被赋予特殊权利,如调整机构设置的能力

从纯面向对象的角度来看,Owner是Player的一个子类(或者,Owner和Player都是一些未定义类的子类,如Participant或其他),但是在考虑持久性时,将Player和Owner表分开似乎是糟糕的数据库设计

我的第一个想法是重构并使用STI,要么让Owner成为Player的子类,要么引入一个新的基类,然后同时为Owner和Player创建子类

我的另一个想法是,我可以向名为is_owner的播放器添加一个布尔/tinyint列,但我可以预见这可能会导致一些讨厌的视图和控制器代码


我想知道是否有人遇到过类似的情况,可能有什么建议,或者可以给我指一些好的在线资源来阅读STI?

也许你应该把
玩家
所有者
看作
代理
代理
之间的关系。因此,
代理
拥有一个
代理
代理
玩一个
代理
的游戏。因此,您可能会引入角色的概念,从而引入一个模型
角色
,从中继承
玩家
所有者
。问题是:您是否曾经想使用
角色
模型?或者你的应用程序是关于所有者和玩家的,除了一些共同的属性之外,它们是两种完全不同的东西

如果它们是两种不同的东西,那么你应该让它们成为两种不同的模型。如果两个模型之间存在代码重复,那么可以使用一个(或多个)mixin在它们之间共享代码

总的来说,我更喜欢组合而不是继承。首先,继承看起来像是在类之间共享代码的一种优雅方式,但它不是这样的。继承是关于类型和接口的。因此,您可以根据它们的接口将它们结合起来。这对模型的进一步开发是一个很大的限制


只有当类之间存在真正的
is\u a
关系而不是
与类之间的
关系共享某些\u code\u时,我才使用继承。更重要的是:我使用它的前提是它对我有技术优势。否则,在ruby中有更好的方法在类之间共享代码

另外,我不认为你需要
:class\u name=>和:foreign\u key=>
来获得
Player
Owner
类中的代码。啊,是的,你是对的。这些都是Textmate默认设置留下的。谢谢你指出这一点。