gpt4 book ai didi

ruby-on-rails - 多态模型黑客

转载 作者:行者123 更新时间:2023-12-04 06:26:06 25 4
gpt4 key购买 nike

尽管我知道,至少据我所知,这不是与 ActiveRecord 进行关联的默认方式,但我正在寻求帮助以实现“休眠”多态模型。

例如,考虑以下基本模型:

# Content only has one property named path
class Content < ActiveRecord::Base
self.abstract_class = true
end

以及具体内容:

# Audio only has one property on it's own (duration).
# However, it should also inherit Content's property (path)
class Audio < Content
end

现在,使用 ActiveRecord 时会发生一些相对有趣的事情,更准确地说是 Rails 3 beta 3 ActiveRecord。如果您在 Content 模型上将 abstract_class 设置为 false 并执行以下操作:

Audio.create!(:path => '/dev/null')

从 Hibernate 的角度来看,它有点工作。即,创建 ID 为 1 的内容记录,创建 ID = 1 的音频记录。

但是,问题 #1 是为了让它工作,您显然需要关闭 abstract_class,这有点破坏了这个抽象内容示例的重点。

此外,问题 #2 是,如果您打开 abstract_class,则在创建 Audio 实例时会丢失内容的属性。而且,如果将其关闭,则在创建音频实例时会丢失音频属性。

理想情况下,当面对一个随后被子类化的抽象类时,ActiveRecord 会向被实例化的具体类(在本例中为 Audio)提供抽象 + 具体属性。实际上,那样的话,在创建 Audio 实例时,我们将拥有:

audio = Audio.new #=> <Audio id: nil, duration: nil, path: nil, created_at: nil, updated_at: nil> 

然后 [自然地] 当您分配 audio.path = '/dev/null' 并执行保存操作时,ActiveRecord 会知道路径属性已被继承,因此需要在父类级别持久化。此外,在同一个保存操作中,如果您设置音频的非继承属性,ActiveRecord 也会将这些更改保留在音频表中。

在介绍之后,我的问题是如何绕过事件记录并以这种方式增强它?

实际上,假设我们正在开发一个旨在为事件记录提供此类功能的 gem。你会怎么做?

PS:我实际上正在考虑开发这样的 gem,尽管这样的 hackery 不应该在没有事先考虑的情况下进行。因此,我们非常欢迎您提供反馈。

最好的问候,数据库管理员

最佳答案

我知道您在这里的目的是什么,但不幸的是,我认为您无法按照自己喜欢的方式开箱即用。

基本上 ActiveRecord 将模型继承用于两件事:

  • 抽象类,子类可以从中继承代码和行为,但不能继承表结构。您可以使用 attr_accessorContent 上实现一个 #path 属性,它会被子类继承,但它不会 被持久化到数据库中,除非你的模型子类的表有一个“路径”列。

  • 单表继承,其中子类继承行为和表持久性。

您可以混合使用这两者,但没有任何情况下 ActiveRecord 模型可以从抽象类继承持久列。持久属性和表列之间始终存在 1:1 的映射。

关于ruby-on-rails - 多态模型黑客,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2822223/

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