5

私は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

そのコードは と の:title列を作成できませんTalk。明らかに、識別子の列はここではほとんど価値がありません。データベース ビューからは、 と の両方に別々のテーブルが必要だからTalkですMeeting

したがって、最終的には、で定義されているものと同じプロパティを共有したいTalkと考えていますが、可能性のある追加のプロパティと 0..1:n の関係 (会議には複数のトークがありますが、会議なしのトークがあります) があります。列の定義を繰り返したり、継承を放棄したりせずにこれを達成する方法はありますか?MeetingEvent

編集

別の例を挙げると、継承について私が気に入っている部分は、一般的なEvents を個別に照会できることです。したがって、特定の日付に何かがあるかどうかを知りたい場合: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.beginTalk.create(:begin => Time.now)。すべての関数にパッチを適用してプロパティをマージせずにこれを回避する方法はありますか? モデルを使用するときに、基礎となる構造を思い出したくありません。

4

1 に答える 1

7

Event の属性を Talk と Meeting に複製したい場合は、それをモジュールに移動できます。

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

これにより、異なるテーブルが得られますが、重複が減ることを意味します。

于 2009-12-01T22:29:45.973 に答える