我开始学习数据映射器 http://datamapper.org/我喜欢它的是我可以用真正的继承来编写我的模型。
现在我想知道是否可以对此进行更高级:
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
and Meeting
.
所以,最后,我想要Talk
and Meeting
共享与定义相同的属性Event
但具有可能的附加属性和 0..1:n 关系(会议可以进行多次会谈,但也有没有会议的会谈。)有没有办法在不重复列定义和/或放弃继承的情况下完成此任务?
Edit
再举一个例子:关于继承,我喜欢的部分是,一般性的Event
s可以单独查询。所以,当我想知道,是否有某个特定的东西: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.begin
or Talk.create(:begin => Time.now)
。有没有办法解决这个问题而不修补所有功能并合并属性?我不想在使用模型时被提醒底层结构。