3

我有一个模型和表格,我认为它非常适合 STI。我的表被称为Finances并有两种类型:收入和费用。此外type还有其他三列:descriptionamountdate

我在 Rails 中使用 STI 变得非常紧张,因为它需要一些黑客攻击。我对 Rails 太陌生,无法破解代码。尽管它有效,但我不明白它。这似乎很危险。

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

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

undefined method `incomes_path' for #<#<Class:0x007fbc95f60b40>:0x007fbc93883220>
4

2 回答 2

5

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

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

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

scope :incomes, where(:type => 'Income')

然后你可以做Finances.incomes

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

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

于 2013-03-05T07:33:33.667 回答
0

如果您使用这样的继承结构,STI 是最好的。你真的不需要使用Finances.where("type = 'Income'"). 您可以简单地使用Income.all. 如果它们对您有帮助,请查看这些帖子。 http://www.therailworld.com/posts/18-Single-Table-Inheritance-with-Rails http://juixe.com/techknow/index.php/2006/06/03/rails-single-table-inheritance /

于 2013-03-05T05:10:18.503 回答