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
列,显然,鉴别器列在这里没什么价值,因为从数据库视图来看, Talk
和Meeting
应该有单独的表。
因此,最后,我希望Talk
和Meeting
共享与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.begin
或Talk.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
这将为您提供不同的表,但意味着减少重复。
- 如何告诉DataMapper对DateTime属性使用“timestamp with time zone”?
- 使用ruby和datamapper检索具有多对多关联的记录
- database.yml和引用无效
- 一对一的DataMapper关联
- rspec,factory_girl和datamapper的spork和cache_classes问题
- Windows上是否支持Datamapper的dm_mysql_adapter gem?
- Sinatra + Heroku + Datamapper使用dm-sqlite-adapter部署问题
- Ruby Datamapper .count始终返回0
- 自动记录DataMapper查询