Rails 3.0 - 最佳实践:模型对象的多个子类型

jay*_*del 5 inheritance ruby-on-rails

所以这可能是一个相当容易回答的问题,但无论如何都要进行.

我想拥有这个视图,比如media_objects /,它显示了一个媒体对象列表.够容易吧?但是,我希望媒体对象列表是MediaObject,CDMediaObject,DVDMediaObject等子类型的集合.这些子类型中的每一个都需要使用db表来表示特定的元数据集,这些元数据在子类型中并不完全相同.

我的第一个传递是为每个子类型创建一个模型,将MediaObject变得足够聪明,以便在其概念性的"所有"行为上加入这些表.这看起来很简单,但我最终做了许多小东西,感觉不是那么棒,所以我想在这里寻求建议.

显然,我没有这个例子的具体代码,但如果你有问题,我很乐意编辑这个问题来提供这些信息......

谢谢!

mea*_*gar 7

为每个子类型创建一个模型是要走的路,但你所说的是多表继承.Rails假定单表继承,并提供非常简单的设置支持.typemedia_objects表中添加一列,并将每个特定类型的MediaObject的所有列添加到表中.然后让你的每个模型成为一个子类MediaObject:

class MediaObject < ActiveRecord::Base

end

class CDMediaObject < MediaObject

end
Run Code Online (Sandbox Code Playgroud)

Rails将处理拉出记录并实例化正确的子类,这样当你MediaObject.find(:all)的结果将包含各种子类的实例的混合时MediaObject.

请注意,这不符合您的要求:

这些子类型中的每一个都需要使用db表来表示特定的元数据集,这些元数据在子类型中并不完全相同.

Rails是关于约定的配置,如果你编写应用程序的优势而不是期望Rails能够适应你的要求,它将使你的生活变得非常简单.是的,STI将浪费空间,为每条记录留下一些未填充的列.你应该关心吗?可能不是; 数据库存储很便宜,如果重要的列上有索引,则额外的列不会影响查找性能.

也就是说,您可以设置非常接近多表继承的东西,但您可能不应该这样做.