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为 and 创建列,Talk显然,鉴别器列在这里没有什么价值,因为从数据库视图来看,应该有单独的表TalkMeeting

因此,最后,我希望TalkMeeting共享与定义相同的属性,Event但可能具有附加属性和 0..1:n 关系(会议可以有多次会谈,但有会谈没有会议。)有吗在不重复列定义和/或放弃继承的情况下实现此目的的方法?

编辑

再举一个例子:我喜欢继承的部分是,general Events 可以单独查询。因此,当我想知道某个:begin日期是否有某事时,我不需要查看两个或多个表,而只需查询该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.beginor Talk.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 回答