0

我有一个引文课程,我希望每个引文都有很多资源。资源可以是 LocalFile、Link(也可能是 Dropbox 文件)。资源将共享大多数功能和列。我想以下列方式使用单表继承。

class Resource < ActiveRecord::Base
  belongs_to :citation
  acts_as_list :scope => :citation
end

class LocalFile < Resource
end

class Link < Resource
end

class Citation < ActiveRecord::Base
  has_many :resources, class_name: "Resource"
end

我希望能够使用类似的代码获取资源集合

cites = mycite.citations

并让 cites 中的每个对象都具有适当的类型(LocalFile、Link 等)。这行得通吗?奇怪的是,尽管进行了广泛的搜索,但我仍然无法找到这个简单问题的答案。

此外,acts_as_list 添加的方法在对各种子类型的对象调用时是否正常工作,即,在所有资源的列表中向上或向下移动它们以进行单个引用

或者,有没有更好的方法来做到这一点?我想让 Citation 类拥有多个子类型的资源集合。从概念上讲,每种资源类型都能够表示以不同方式访问的相同内容。

4

1 回答 1

0

在处理共享大部分相同功能和数据字段的模型类时,应考虑 STI,但作为开发人员,您可能希望更精细地控制单独扩展或添加到每个类。STI 允许您在编写专门的功能时使用将数据保存在单个表中,而不是为多个表(而不是 DRY)一遍又一遍地复制代码或放弃添加特殊功能或方法的灵活性。

实施 STI:-

  1. 创建基类
  2. 除了您需要的属性,将 :type 属性作为字符串添加到基类
  3. 创建任何必要的后代类

性传播感染的缺点

STI 并不总是适合您的架构的最佳设计选择。如果您打算用于 STI 的子类具有许多不同的数据字段,那么将它们全部包含在同一个表中会导致大量空值,并且难以随着时间的推移进行扩展。在这种情况下,您的模型子类中可能会出现如此多的代码,以至于子类之间的共享功能很少并且需要单独的表。另外,正如我上面提到的,不应该仅仅因为两种对象类型具有相似的属性而使用 STI——飞机和自行车都有轮子,但是将它们分组到同一个表中可能没有意义,因为直观地说,它们'是在应用程序中具有截然不同的功能和数据字段的不同对象。

希望能帮助到你 :)

于 2015-06-03T14:34:18.977 回答