Rails 单表继承 (STI) 的替代方案?

Cas*_*sey 3 ruby-on-rails sti

我有一个模型和表格,我相信它非常适合 STI。我的表名为Finances“收入”和“支出”,有两种类型。除此之外,type还有其他三列:descriptionamountdate

我对在 Rails 中使用 STI 感到非常紧张,因为它需要一些技巧。我对 Rails 太陌生,无法修改代码。尽管它有效,但我不明白它。这看起来很危险。

我的问题是,如果我不使用 STI,如何设置我的模型、控制器和视图?在我的模型中对项目进行分组的最佳实践是什么?Finances.where("type = 'Income'")或者我只是在设置视图之前做?

编辑:我提出了一个要点来展示我正在使用的代码。当我运行它时,我收到错误:

undefined method `incomes_path' for #<#<Class:0x007fbc95f60b40>:0x007fbc93883220>
Run Code Online (Sandbox Code Playgroud)

kr1*_*kr1 5

首先,使用STI是Rails的标准,因此无需感到紧张。并且不需要“黑客攻击”。它已被许多开发人员非常成功地使用。正如您所看到的,您可以在网上找到教程和一般信息。

另一方面,如果您决定不使用 STI,则可以选择使用
(a) 具有自己的表的完全独立的模型,这将导致大量重复的代码,或者
(b) 创建自定义的“ STI-就像“用手的行为”。第二种选择至少对于了解有关 Rails 的更多信息可能会很有趣。

例如,在您的Finances模型中,您将定义一个范围incomes,例如

scope :incomes, where(:type => 'Income')
Run Code Online (Sandbox Code Playgroud)

那么你就可以做Finances.incomes

然后,如果您有仅适用于其中一种类型的方法,则应检查所有记录是否均有效地属于所需类型。

就我个人而言,我建议您使用 STI。您可以免费获得许多功能,并且可以按照Rails 的方式进行操作。例如,想象一下,其他开发人员阅读您的代码,他们会问自己,为什么您没有使用 STI,将其归咎于无知,并且 - 如果需要 - 使用 STI 重构它。