gpt4 book ai didi

ruby-on-rails - 带关联的 Ruby Datamapper 表继承

转载 作者:数据小太阳 更新时间:2023-10-29 07:14:03 24 4
gpt4 key购买 nike

我开始学习了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 列,显然,鉴别器列在这里没有什么值(value),因为从数据库的角度来看,应该有TalkMeeting 的单独表格。

所以,最后,我希望 TalkMeeting 共享在 Event 中定义的相同属性,但具有可能的附加属性和具有 0..1:n 关系(一个 session 可以有多个会谈,但也有没有 session 的会谈。)有没有办法在不重复列定义和/或放弃继承的情况下实现这一目标?

编辑

再举一个例子:我喜欢继承的部分是,可以单独查询通用的 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.beginTalk.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

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

关于ruby-on-rails - 带关联的 Ruby Datamapper 表继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1829161/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com