在RoR中使用继承

问题描述 投票:2回答:3

我正在开发我的第一个Rails应用程序(就此而言,是我的第一个Ruby应用程序),我有一个关于继承的最佳实践问题。我必须能够上载物理媒体,并且希望将物理属性分别存储在数据库中,以便可以像在应用程序内部一样容易地在应用程序外部查询某些属性。要管理此属性,我有一个images表和binaries表。当然,前者存储特定于图像的元数据,而后者存储将应用于一系列文件类型的物理文件元数据。确定方法后,我将添加一个swfs表,一个videos表,也许还有其他表。

[目前,我有一个BinaryObserver类捕获图像的before_create回调并上传物理文件-二进制文件。这工作正常,但我想知道其他方法。具体来说,我想知道是否无法(也不应该)建立一个基本继承模型,其中Binary扩展ActiveRecord::BaseImage扩展Binary

就目前而言,是Image belongs_to BinaryBinary has_one Image。但是,由于存在明显的is-a关系,我应该使用继承吗?与数据库交互时,Rails甚至支持这种东西吗?这可能是减少支持新文件类型所需工作量的最佳方法。

将对此表示任何想法或建议。我正在尝试使用该语言和框架,因此在尝试深入学习之前,我正在尝试学习最佳实践。

谢谢。

ruby-on-rails
3个回答
1
投票

幸运的是,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)

0
投票

从数据库的角度来看,您不需要二进制表。如果将二进制数据保存在数据库中,则它只是一个属性,例如日期,并且不会创建日期表。

说Image扩展Binary是因为Image“ is-a” Binary不准确,Image“ is-made-of” Binary就像是由Flesh制成的Person一样(您不会说Person扩展肉体)。

无论如何,有一个用于附件的插件:attachment_fu,使用它:)


-1
投票

如果您正在编写生产代码而不仅仅是测试产品,那么我强烈建议您使用attachment_fu或类似方法来处理这种情况。

© www.soinside.com 2019 - 2024. All rights reserved.