Deb*_*ski 5 ruby ruby-on-rails merb datamapper
我开始学习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
Run Code Online (Sandbox Code Playgroud)
该代码无法创建:title为列Talk,显然,鉴别列是没有什么价值在这里,因为从一个数据库视图,应该有两个单独的表Talk和Meeting.
所以,最后,我希望Talk和Meeting共享相同的属性,Event但有可能的附加属性和0..1:n关系(一个会议可以有几个会谈,但没有会议的会谈.)有吗一种方法来实现这一点,而无需重复列定义和/或放弃继承?
编辑
再举一个例子:我喜欢继承事物的部分是,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
Run Code Online (Sandbox Code Playgroud)
但是,为了使用它,我需要Event每次手动创建一个,我想创建或编辑一个Talk.也就是说,我不能做talk.begin或Talk.create(:begin => Time.now).如果没有修补所有函数并合并属性,有没有办法解决这个问题?我不想在使用模型时提醒底层结构.
小智 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
Run Code Online (Sandbox Code Playgroud)
这将为您提供不同的表格,但意味着减少重复.