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

时间:2013-03-05 04:52:28

标签: ruby-on-rails sti

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

我在Rails中使用STI时非常紧张,因为它需要一些黑客攻击。我太新了Rails来破解代码。即使它有效,我也不明白。这似乎很危险。

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

编辑:我制作了一个gist来显示我正在使用的代码。当我运行它时,我收到错误:

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

2 个答案:

答案 0 :(得分:4)

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

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

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

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

然后你可以Finances.incomes

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

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

答案 1 :(得分: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/