【问题标题】:Ruby Datamapper table inheritance with associationsRuby Datamapper 表继承与关联
【发布时间】: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 列,显然,鉴别器列在这里没有什么价值,因为从数据库视图来看,TalkMeeting 应该有单独的表.

所以,最后,我希望 TalkMeeting 共享 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.beginTalk.create(:begin =&gt; Time.now)。有没有办法在不修补所有功能和合并属性的情况下解决这个问题?我不想在使用模型时被提醒底层结构。

【问题讨论】:

  • 真正的继承是指哪种类型的继承——单表继承、类表继承或具体表继承? martinfowler.com/eaaCatalog
  • 我的意思是Ruby类继承。
  • 无论这对表意味着什么,我都不太在意——只要我可以分别使用每个 Ruby 模型并从子类到父类再转换/分配。
  • 在这种情况下,我认为可以使用 ActiveRecord 来完成。

标签: ruby-on-rails ruby datamapper merb


【解决方案1】:

如果您想将 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

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

【讨论】:

  • 但不幸的是,这意味着没有透明的方法可以同时查询所有事件,所以我必须为所有类型的事件复制。
  • 是的,但单表继承仅适用于行为不同但具有相同底层结构/表的对象。您需要存储所有属性(例如在 Event 类中)并为每个子类内部的关系构建逻辑。不幸的是,STI 建议有一些神奇的灵活数据解决方案,但这种情况很少见。随着模型的分离,它们会变得过于紧密耦合,STI 将不再有意义。
  • 你说得对,无论如何我都必须为这样的结构做出妥协。希望在某个时候,可以使用 DataMapper::EmbeddedValue 来简化您的建议。
  • 这似乎不适用于 1.2.0:“未初始化的常量 DataMapper::Types” - 您需要使用 DataMapper::Property
猜你喜欢
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多