ruby-on-rails – Rails 3.0 – 最佳实践:模型对象的多个子类型
所以这可能是一个相当容易回答的问题,但无论如何都要进行.
我想拥有这个视图,比如media_objects /,它显示了一个媒体对象列表.够容易吧?但是,我希望媒体对象列表是MediaObject,CDMediaObject,DVDMediaObject等子类型的集合.这些子类型中的每一个都需要使用db表来表示特定的元数据集,这些元数据在子类型中并不完全相同. 我的第一个传递是为每个子类型创建一个模型,将MediaObject变得足够聪明,以便在其概念性的“所有”行为上加入这些表.这看起来很简单,但我最终做了许多小东西,感觉不是那么棒,所以我想在这里寻求建议. 显然,我没有这个例子的具体代码,但如果你有问题,我很乐意编辑这个问题来提供这些信息…… 谢谢! 解决方法
为每个子类型创建一个模型是要走的路,但你所说的是多表继承. Rails假定单表继承,并提供非常简单的设置支持.将类型列添加到media_objects表,并将每个特定类型的MediaObject的所有列添加到表中.然后使每个模型成为MediaObject的子类:
class MediaObject < ActiveRecord::Base end class CDMediaObject < MediaObject end Rails将处理拉出记录并实例化正确的子类,这样当MediaObject.find(:all)时,结果将包含MediaObject的各个子类的实例的混合. 请注意,这不符合您的要求:
Rails是关于约定的配置,如果你编写应用程序的优势而不是期望Rails能够适应你的要求,它将使你的生活变得非常简单.是的,STI将浪费空间,为每条记录留下一些未填充的列.你应该关心吗?可能不是;数据库存储很便宜,如果重要的列上有索引,则额外的列不会影响查找性能. 也就是说,你可以设置something very close到多表继承,但你可能不应该. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |