3

即使我知道,至少据我所知,这是不是做与ActiveRecord关联的我寻求帮助,以实施“hibernatish”多态模型的默认方式。多态模型两轮牛车

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

# 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的东西比较有趣的情况。如果在内容模型上将abstract_class设置为false,并执行以下操作:

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

它有点适用于Hibernate的角度。也就是说,内容记录与ID 1和音频记录创建也与ID创建 = 1

然而,问题#1是为了这个工作,你显然需要关闭abstract_class,这有点违反了这个抽象内容示例的全部要点。

此外,问题#2是,如果您打开abstract_class,创建音频实例时将失去内容的属性。而且,如果关闭它,创建音频实例时会失去“音频”属性。

理想,当遇到一个抽象类,然后将其子类,ActiveRecord的将提供抽象+混凝土性能的具体类被实例化,在这种情况下音频。实际上,这样一来,创建音频实例时,我们将有:

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

,然后按[自然]当你将audio.path =“的/ dev/null的”,并进行了保存操作,ActiveRecord的会知道路径属性已被继承,因此需要在父级别级别持久化。此外,在相同的保存操作中,您应该设置音频的非继承属性。ActiveRecord还会在audios表中保留这些更改。

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

实际上,让我们假设我们正在开发一个旨在为这种功能提供活动记录的gem。你将如何去做,并做到这一点? PS:我实际上正在考虑开发这样的宝石,虽然这种骇人听闻不应该没有预先思考。所以,你的反馈是最受欢迎的。

最好的问候, DBA

回答

2

我看你要什么在这里,但不幸的是,我不认为你可以得到这个工作的开箱你喜欢的方式。

基本上ActiveRecord的使用模型继承了两件事情:

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

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

您可以将两者混合使用,但ActiveRecord模型不能从抽象类继承持久性列。永久性属性和表列之间总是有1:1的映射关系。

+0

随着时间的推移,我意识到了这一点。感谢您将我的问题放在文字中。 – DBA 2010-11-08 10:02:18