我有一个模型和表格,我相信它非常适合STI。我的表名为Finances
,有两种类型:收入和费用。除type
之外,还有其他三列:description
,amount
和date
。
我在Rails中使用STI时非常紧张,因为它需要一些黑客攻击。我太新了Rails来破解代码。即使它有效,我也不明白。这似乎很危险。
我的问题是,如果我不使用STI,如何设置我的模型,控制器和视图?在模型中对项目进行分组的最佳做法是什么?或者我在设置视图之前只做Finances.where("type = 'Income'")
?
编辑:我制作了一个gist来显示我正在使用的代码。当我运行它时,我收到错误:
undefined method `incomes_path' for #<#<Class:0x007fbc95f60b40>:0x007fbc93883220>
答案 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/