【问题标题】:How to overcome an apparent REST vs. DRY dilemma in rails?如何克服 Rails 中明显的 REST 与 DRY 困境?
【发布时间】:2010-04-01 20:55:54
【问题描述】:

我正在开发的 Rails 应用具有二次方程的示例。显然,这些都是一个共同的结构:ax^2 + bx + c = 0。

我不想存储其中的每一个示例。我宁愿从模板中生成它们。存储这种结构的数百个可能版本似乎非常浪费且不干燥。

另一方面,如果我生成它们,我就不能像它们只是多个数据库对象那样可靠地再次访问它们。

我确信一定有办法克服这个问题,但我仍在学习 rails,显然我在这里没有掌握一些东西。谢谢。

【问题讨论】:

    标签: ruby-on-rails database rest dry


    【解决方案1】:

    答案是“视情况而定”。如果你只打算做二次方程的例子,那么你可以只存储 a、b 和 c。如果您认为您将要做其他类型的方程式,请存储整个内容。

    真正不应该考虑的是,在您浪费磁盘空间的意义上,存储完整方程是一种“浪费”。除非您要存储数以百万计的这些东西,否则不要担心。磁盘很便宜。

    其他观点是 YAGNI(Ya Ain't Gonna Need It),它会说用你现在的情况编码,二次方程,不要担心泛化它。如果需要,您可以稍后重构代码和数据。

    另一种看待它的方式是 KISS(保持简单,愚蠢)。最简单的做法可能是只存储完整的方程。这使得检索方程成为一个简单的数据库获取,不需要生成方程的代码。

    就个人而言,假设您没有做大量这些事情,我会在这种情况下支持 KISS。我不相信该系统只会用于二次方程。您可以做的是让系统处理任何方程,但使输入形式采用 a、b 和 c 并将其转换为二次方程。如果以后需要其他方程类型,更改输入逻辑比更改数据结构要简单得多。

    【讨论】:

    • 肯定会有其他类型的方程,一些在结构上可分组/可生成,如二次方程,另一些则不是。 “浪费”我的意思不是磁盘空间,而是重复我自己,例如,如果我想更改每个二次示例的措辞,我将不得不在数百个地方更改它。我猜我可以通过迁移或其他海量数据库操作来做到这一点,但我想知道存储这么多或多或少相同的东西是否是不好的做法。尤其是因为我将在其他类型的方程式上做同样的事情,这些方程式也或多或少相同。
    • 阅读更多内容,我想知道播种数据库是否是这里的方法。大概我可以根据可能的模式播种,如果需要,我可以通过重新播种来改变它?
    • @Chris 您的第一条评论暗示您谈论的不仅仅是存储方程式,还包括周围的示例文本?它都一样吗?在这种情况下,我会为二次示例编写一个模板,该模板将键/值对作为参数,因此您可以将它提供给它 a=2 b=4 c=7 以及您以后发现需要的任何其他变量。其他类型可以使用其他模板。然后你可以改变模板。这本质上是您生成方程式的最初想法,但当它不仅仅是一个方程式时,它更有意义。
    【解决方案2】:

    资源不必存储在数据库中就可以安静且可靠地访问。你只需要资源的标识符和你生成的资源一一对应。

    只需使用a,b,c 作为ax^2 + bx + c = 0 的标识符。然后,如果您的路线是resources :quadratics,您可以生成类似quadratic_url([a,b,c].join(',')) 的url,并在QuadraticsController 的show 方法中,通过generate_quadratic(params[:id].split(',').map(&:to_i)) 生成它。

    【讨论】:

      【解决方案3】:

      如果您的示例是任意且独立的,则必须存储系数 a、b、c 来定义二次方程。

      如果你想要唯一二次方程,你可以去掉一个方程的 a、b 和 c 与另一个方程的值相差一个常数倍的方程。

      您可以通过将 a、b 和 c 选择为介于 -5 和 +5 之间(含)的整数来生成 1,210 个不同的二次方程 - 当然,a 不能为零 - 但我不知道这是否是你的想要吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-04
        • 2011-02-25
        • 2012-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多