2009-12-01 11 views
5

私はDatamapperを学習し始めました。私が気に入ったのは、本当の継承を使ってモデルを書くことができるということでした。Ruby Datamapperテーブルの継承(アソシエーションあり)

今ではこのことについて、より高度なことが可能であるならば、私は、不思議:

class Event 
    include DataMapper::Resource 
    property :id, Serial 
    property :begin, DateTime 
    property :type, Discriminator 
end 

class Talk<Event 
    property :title, String 
    belongs_to :meeting 
end 

class Meeting<Event 
    has n, :talks 
end 

コードがTalkため:title列の作成に失敗したと明らかに、識別カラムは、ここにほとんど価値があることを、ので、データベースビューでは、TalkMeetingの両方に別のテーブルが存在する必要があります。

だから、最後に、私はEventではなく、可能な追加のプロパティを持つと0..1で定義されたものと同じ性質を共有するTalkMeetingをしたい:nの関係(会議は、いくつかの話し合いを持つことができますが、協議があります列の定義を繰り返したり、継承を放棄することなく、これを達成する方法はありますか?

編集

別の例を与える:私は相続の事を好きな部分は、一般的なEvent sが個別に照会することができるということ、です。だから、特定の:beginの日付に何かがある場合、私は2つ以上のテーブルを調べる必要はありませんが、Eventテーブルを照会するだけでよいことを知りたいと思います。ある意味では、次のような構造が私のニーズに合っています。

class Event 
    include DataMapper::Resource 
    property :id, Serial 
    property :begin, DateTime 
end 

class Talk 
    include DataMapper::Resource 
    property :id, Serial 
    property :title, String 
    belongs_to :event 
    belongs_to :meeting 
end 

class Meeting 
    include DataMapper::Resource 
    property :id, Serial 
    belongs_to :event 
    has n, :talks 
end 

しかし、これを使用するためには、私は手動でEventを毎回作成する必要があります、私はTalkを作成または編集します。つまり、私はtalk.beginまたはTalk.create(:begin => Time.now)を行うことはできません。すべての機能にパッチを当てたり、プロパティをマージしたりせずに、これを回避する方法はありますか?私は、モデルを使用する際に基礎となる構造を思い出させたくありません。

+0

単一継承、クラステーブル継承、または具体的なテーブル継承を継承する継承のタイプを教えてください。 http://martinfowler.com/eaaCatalog/ – MattMcKnight

+0

私はRubyクラスの継承を意味します。 – Debilski

+0

テーブル単位の意味でも、Rubyモデルを個別に使用し、サブクラスから親と後ろにキャスト/アサインすることができれば、それほど気にしません。 – Debilski

答えて

8

あなたがトークとミーティングへのイベントの属性を複製する場合、あなたはモジュールに移動できます。

module EventFields 
    def self.included(base) 
    base.class_eval do 
     include DataMapper::Resource 
     property :id, DataMapper::Types::Serial 
     property :begin, DateTime 
     # other fields here 
    end 
    end 
end 

class Talk 
    include EventFields 
    property :title, String 
    belongs_to :meeting 
end 

class Meeting 
    include EventFields 
    has n, :talks 
end 

これはあなたに別のテーブルを与えるが、重複が減少していることを意味します。

+0

しかし、残念なことに、すべてのイベントを同時に照会する透過的な方法はないので、すべてのタイプのイベントを複製する必要があります。 – Debilski

+0

真であるが単一の表の継承は、異なる動作をするが基本構造/表が同じオブジェクトに対して合理的に適している。 すべての属性(Eventクラスなど)を格納し、各子クラス内の関係のロジックを構築するというヒットが必要です。 残念ながら、STIはいくつかの魔法の柔軟なデータ解決策を提案していますが、まれにしかありません。モデルがばらばらになるにつれて、それらはあまりにも緊密に結合され、STIはこれ以上意味をなさないでしょう。 – JamesAlmond

+0

あなたはそうです、私はそのような構造のためにとにかく妥協をしなければなりません。うまくいけば、DataMapper :: EmbeddedValueがあなたの提案を楽にすることができるようになります。 – Debilski