Ruby Datamapper表继承与关联

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,显然,鉴别列是没有什么价值在这里,因为从一个数据库视图,应该有两个单独的表TalkMeeting.

所以,最后,我希望TalkMeeting共享相同的属性,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.beginTalk.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)

这将为您提供不同的表格,但意味着减少重复.