【问题标题】:Alternative to Rails Single Table Inheritance (STI)?Rails 单表继承 (STI) 的替代方案?
【发布时间】:2013-03-05 04:52:27
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: ruby-on-rails sti


    【解决方案1】:

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

    另一方面,如果您决定不使用 STI,您可以选择使用
    (a) 将模型与自己的表完全分开,这将导致大量重复代码,或者
    (b) 手动为您创建自定义的“STI-like”行为。 第二个选项至少对了解 Rails 很有趣。

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

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

    那么你可以做Finances.incomes

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

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

    【讨论】:

    • 好的,你已经说服我继续推进 STI。我想我把模型部分放下了,但是在控制器或视图中使用它时很困惑。如果你不介意,我想今天晚些时候在 Github 上发布一些代码,这样你就可以看到我哪里出错了。
    • 嘿,对于僵尸帖子感到抱歉,但您认为@kr1 的多态继承如何?仅供参考,我正在与医生和医院,两个不同的用户组一起制作应用程序。你用过这些还是 STI 仍然是 Rails 方式?
    【解决方案2】:

    如果您使用这样的继承结构,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/

    【讨论】:

    • 但是使用 form_for 呢? henrik.nyh.se/2012/08/rails-sti-and-form-for 我在这篇文章中发现我需要使用 object.becomes 才能使其与 STI 一起使用。作者在文末说这个方法比较脆弱所以一定要测试一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    相关资源
    最近更新 更多