2013-03-05 71 views
2

我有一个模型和表格,我认为它非常适合STI。我的表叫做Finances,有两种类型:收入和支出。除了type还有其他三列:descriptionamountdate替代Rails单表继承(STI)?

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

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

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

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

回答

4

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

如果在另一方面,你决定不使用STI,你必须使用
(一)完全独立的模型与自己的表的选择,这将导致很多重复的代码,或
(b)创建自定义“类似STI的”行为。 第二个选项至少可以让你更多地了解Rails。

例如,在你的Finances模型,你会定义范围incomes,像

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

那么你可以做Finances.incomes

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

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

+0

好的,你说服我继续推进性传播疾病。我认为我有模型部分,但在Controller或View中使用它时感到困惑。如果你不介意,我想今天晚些时候在Github上发布一些代码,这样你就可以看到我出错的地方。 – Casey 2013-03-05 17:20:32

+1

您也可以将其发布在http://codereview.stackexchange上。com – kr1 2013-03-05 18:43:48

+0

嘿抱歉僵尸帖子,但你认为@ kr1多态继承?仅供参考,我正在与医生和医院,两个不同的用户群组开发应用程序。你用过这些还是STI还是Rails的方式? – 2014-04-03 20:22:15

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/

+0

但是如何使用form_for? http://henrik.nyh.se/2012/08/rails-sti-and-form-for/我在这篇文章中发现我需要使用object.becomes来使它与STI协同工作。作者在文章结尾说这种方法很脆弱,所以一定要测试一下。 – Casey 2013-03-05 05:21:28