Ruby Datamapper表inheritance与关联

我开始学习Datamapper ,我喜欢它的是我可以用真正的inheritance来编写我的模型。

现在我想知道,如果有可能更加先进:

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应该有单独的表。

因此,最后,我希望TalkMeeting共享与Event定义的相同的属性,但可能具有其他属性并且具有0..1:n关系(会议可以有几个Talk Meeting Talk 。 )有没有办法在不重复列定义和/或放弃inheritance的情况下实现这一目标?

编辑

再举一个例子:我喜欢inheritance的部分是,可以单独查询一般Event 。 所以,当我想知道,如果有某些东西: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.beginTalk.create(:begin => Time.now) 。 有没有办法绕过这个没有修补所有function和合并属性? 我不想在使用模型时提醒底层结构。

如果要将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 

这将为您提供不同的表,但意味着减少重复。