我正在开发我的第一个Rails应用程序(就此而言,是我的第一个Ruby应用程序),我有一个关于继承的最佳实践问题。我必须能够上载物理媒体,并且希望将物理属性分别存储在数据库中,以便可以像在应用程序内部一样容易地在应用程序外部查询某些属性。要管理此属性,我有一个images
表和binaries
表。当然,前者存储特定于图像的元数据,而后者存储将应用于一系列文件类型的物理文件元数据。确定方法后,我将添加一个swfs
表,一个videos
表,也许还有其他表。
[目前,我有一个BinaryObserver
类捕获图像的before_create
回调并上传物理文件-二进制文件。这工作正常,但我想知道其他方法。具体来说,我想知道是否无法(也不应该)建立一个基本继承模型,其中Binary
扩展ActiveRecord::Base
而Image
扩展Binary
。
就目前而言,是Image belongs_to Binary
和Binary has_one Image
。但是,由于存在明显的is-a
关系,我应该使用继承吗?与数据库交互时,Rails甚至支持这种东西吗?这可能是减少支持新文件类型所需工作量的最佳方法。
将对此表示任何想法或建议。我正在尝试使用该语言和框架,因此在尝试深入学习之前,我正在尝试学习最佳实践。
谢谢。
幸运的是,rails中内置了一个非常好的单表继承。
不幸的是,您正在寻找的是多表并且支持非常暗淡。
查看有关人们如何实施此类示例:
http://zackham.com/2008/8/21/multiple-table-inheritance
http://github.com/sava/class_table_inheritance/tree/master
http://github.com/rwl4/inherits_from/tree/master
或者您可以切换到单表继承(尽管这会打败您先前的评论):
class Binary < ActiveRecord::Base
end
class Image < Binary
end
并将其添加到您的Binary模型中:
type VARCHAR(20) NOT NULL
示例:
@binaries = Binary.find(:all)
@images = Image.find(:all)
从数据库的角度来看,您不需要二进制表。如果将二进制数据保存在数据库中,则它只是一个属性,例如日期,并且不会创建日期表。
说Image扩展Binary是因为Image“ is-a” Binary不准确,Image“ is-made-of” Binary就像是由Flesh制成的Person一样(您不会说Person扩展肉体)。
无论如何,有一个用于附件的插件:attachment_fu
,使用它:)
如果您正在编写生产代码而不仅仅是测试产品,那么我强烈建议您使用attachment_fu
或类似方法来处理这种情况。