加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 03:27:33 所属栏目:百科 来源:网络整理
导读:所以这可能是一个相当容易回答的问题,但无论如何都要进行. 我想拥有这个视图,比如media_objects /,它显示了一个媒体对象列表.够容易吧?但是,我希望媒体对象列表是MediaObject,CDMediaObject,DVDMediaObject等子类型的集合.这些子类型中的每一个都需要使用db
所以这可能是一个相当容易回答的问题,但无论如何都要进行.

我想拥有这个视图,比如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的各个子类的实例的混合.

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

Each of these subtypes needs to be represented with a db table for specific set of metadata that is not entirely common across the subtypes.

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

也就是说,你可以设置something very close到多表继承,但你可能不应该.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读