私は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で読むために良いオンラインリソースを教えてもらえますか?
Ps。 'Player'クラスと' Owner'クラスのコードでは 'class_name =>と:foreign_key =>'は必要ないと思います。 – Zabba
ああ、あなたは正しいです。それらはTextmateのデフォルトから残されていました。それを指摘していただきありがとうございます。 –