2011-05-30 4 views
3

私はSTIを使う必要があるかもしれないと思うプロジェクト(Rails 3.0.3)に取り組んでいますが、余分な列をテーブルに追加してそれを行うだけでよいのか分かりません。Rails 3:STIを使用するか、余分な列を使うべきですか?

私のオブジェクトモデル(ゲームシステム用)には、(代理店に所属する)プレーヤーと代理店を所有する所有者があります。

プレーヤーと所有者の両方がユーザーアカウントであるエージェントによって所有されているため、代理店は多くの代理店のプレーヤーまたは所有者になる可能性があります。

代わりに、名前付きのエージェント 'user'が必要です。だから私はこれを持っている:

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 

プレイヤーと所有者の両方のシェアはまったく同じ属性、両者の唯一の違いは、その所有者がプレーヤー以外庁との異なる関係を持っている(所有者庁、機関を所有していのみ所有者は1人だが、選手は多い)。

さらに、所有者には代理店の設定を調整するなどの特別な権利が与えられます。

OwnerはPlayerのサブクラスです(または、OwnerとPlayerはどちらもParticipantなどの未定義クラスのサブクラスです)が、永続性を考慮すると、データベース設計が悪い選手とオーナーのテーブル。

私は最初にSTIをリファクタリングして使用し、所有者をPlayerのサブクラスにしたり、新しい基本クラスを導入して、オーナーとプレイヤーの両方をサブクラス化したりしました。

私の考えは、is_ownerという名前のブール値/ tinyint列をPlayerに追加することができるということでした。しかし、これを見れば、厄介なビューやコントローラコードにつながる可能性があります。

誰かが同じような状況に遭遇していて、何かアドバイスがありましたか、またはSTIで読むために良いオンラインリソースを教えてもらえますか?

+0

Ps。 'Player'クラスと' Owner'クラスのコードでは 'class_name =>と:foreign_key =>'は必要ないと思います。 – Zabba

+0

ああ、あなたは正しいです。それらはTextmateのデフォルトから残されていました。それを指摘していただきありがとうございます。 –

答えて

1

多分PlayerOwnerは、AgentAgencyの関係として考える必要があります。したがって、Agentは、AgencyAgentのゲームを持っています。のゲームはAgencyです。したがって、ロールの概念、つまりとOwnerが継承するモデルRoleを導入することができます。質問は次のとおりです:Roleモデルを使用したいですか?または、所有者と選手についてのあなたのアプリケーションであり、いくつかの共通の属性を除いて、2つの全く異なる種類のものですか?

2つの異なる場合は、2つの異なるモデルにする必要があります。 2つのモデルの間にコードの重複がある場合、それらの間でコードを共有するために(または複数の)mixinを使用することがあります。

一般に、私は継承を超えた構成を好みます。最初の継承では、クラス間でコードを共有するためのエレガントな方法のように見えますが、それについてのことではありません。継承は型とインタフェースに関するものです。したがって、インターフェイスの面で物事を結合します。これはあなたのモデルのさらなる発展の強力な制約です。

実際のis_aの関係があり、クラス間の関係がshares_some_code_withではない場合のみ、継承を使用します。さらに重要なのは、それが私にとって技術的利点を持っている場合に限り、私はそれを使用することです。さもなければ、Rubyのクラス間でコードを共有する方がずっと良い方法があります。

関連する問題