【发布时间】:2010-12-22 04:45:29
【问题描述】:
我开始学习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 列,显然,鉴别器列在这里没有什么价值,因为从数据库视图来看,Talk 和Meeting 应该有单独的表.
所以,最后,我希望 Talk 和 Meeting 共享 Event 中定义的相同属性,但可能具有附加属性和 0..1:n 关系(会议可以有多个会谈,但有会谈没有会议。)有没有办法在不重复列定义和/或放弃继承的情况下完成此任务?
编辑
再举一个例子:我喜欢继承的部分是,一般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.begin 或Talk.create(:begin => Time.now)。有没有办法在不修补所有功能和合并属性的情况下解决这个问题?我不想在使用模型时被提醒底层结构。
【问题讨论】:
-
真正的继承是指哪种类型的继承——单表继承、类表继承或具体表继承? martinfowler.com/eaaCatalog
-
我的意思是Ruby类继承。
-
无论这对表意味着什么,我都不太在意——只要我可以分别使用每个 Ruby 模型并从子类到父类再转换/分配。
-
在这种情况下,我认为可以使用 ActiveRecord 来完成。
标签: ruby-on-rails ruby datamapper merb