ruby-on-rails – 具有关联的Ruby Datamapper表继承
发布时间:2020-12-17 03:33:44 所属栏目:百科 来源:网络整理
导读:我开始学习 Datamapper,我喜欢它的是我可以用真正的继承来编写我的模型. 现在我想知道,如果有可能更加先进: class Event include DataMapper::Resource property :id,Serial property :begin,DateTime property :type,Discriminatorendclass TalkEvent prop
我开始学习
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关系(会议可以有多个会话,但是会议没有会议. )有没有办法在不重复列定义和/或放弃继承的情况下实现这一目标? 编辑 再举一个例子:我喜欢继承的部分是,可以单独查询一般事件.所以,当我想知道,如果有某些东西:开始日期,我不需要查看两个或更多表,但可以只查询事件表.在某种程度上,以下结构可以满足我的需求. class Event include DataMapper::Resource property :id,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 但是,为了使用它,我需要每次手动创建一个事件,我想创建或编辑一个Talk.也就是说,我不能做talk.begin或Talk.create(:begin => Time.now).如果没有修补所有函数并合并属性,有没有办法解决这个问题?我不想在使用模型时提醒底层结构. 解决方法
如果要将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 这将为您提供不同的表格,但意味着减少重复. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |