加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读