【问题标题】:Storing a percentage in Rails + MySQL在 Rails + MySQL 中存储百分比
【发布时间】:2011-11-20 17:27:00
【问题描述】:

我需要在我的 Rails 应用程序中使用百分比。在任何视图中,包括用户输入的视图,格式都需要为百位格式,100.000。用于计算时,需要用百分之一格式表示,1.00000

我的迁移(我正在将列添加到现有表中)具有以下行:

add_column :worker, :cash_split, :decimal, :precision => 6, :scale => 5

所以,截至目前,我将其存储为百分之一 (1.00000) 格式。我选择以这种格式存储它的基础是,当我需要进行乘法运算时,我认为这将意味着更清晰的业务逻辑(即没有worker.cash_split / 100.0.to_d 代码)。

我唯一的另一个想法可能是滥用composed_of方法。我可以将数百个 (100.000) 格式的数据存储为 cash_split,然后创建一个属性访问器 cash_split_percentage,它以 1.0000 格式返回 cash_split

【问题讨论】:

    标签: mysql ruby-on-rails


    【解决方案1】:

    你的第一个想法是正确的......不要想太多。

    您绝对应该以百分之一的格式将百分比数字存储在数据库中。并在所有 Ruby 计算中使用该格式。

    百分比数字是一种显示约定。例如 number 0.45 显示为 45%。因此,使用 View 帮助器将百分比数字从其内部格式(十进制数字)转换为您选择的显示格式——一个包含 % 符号的字符串。

    【讨论】:

    • 您将如何处理表单中的百分比?用户希望输入 45%,但应存储为 0.45。然而,如果用户输入了错误的另一个字段并且表单被重新呈现,那么百分比字段应该是 45 而不是 0.45。有了这个我想说回调可能不是最终的解决方案。
    • 您可以为百分率的百分比编写 getter 和 setter。因此,您将拥有属性 #some_ratio 和方法 #some_ration_percentage 和 #some_ration_percentage= ,它们只会除/乘以 100 并继续前进。
    • @BishmaStornelli 完全同意。在这里写评论,但我不妨写另一个答案来提供这个观点。
    【解决方案2】:

    视情况而定。

    首先,我认为没有正确的方法或错误的方法。它是您的应用程序和您的代码,因此您可以做您想做的事情,但您应该做最适合您的情况的事情。

    作为@BishmaStornelli commented 中的@LarryK's answer

    您将如何处理表单中的百分比?用户希望输入 45%,但应存储为 0.45。然而,如果用户输入了错误的另一个字段并且表单被重新呈现,那么百分比字段应该是 45 而不是 0.45。有了这个我想说回调可能不是最终的解决方案。

    如果你这样做,你会被诅咒,如果你不这样做,你会被诅咒。您要么将计算代码除以 100 来混淆计算代码,要么将模型和视图从小数转换为百分比,然后再转换回来。

    我想答案取决于您的应用程序中哪个更重。

    如果您要根据这个百分比进行大量计算,那么将其存储为小数似乎是提供最少代码量和最清晰、最干净的代码以供查看和维护的最佳方法。

    但是,如果您没有根据这个百分比进行大量计算(可能只有几个),那么不必在模型和视图中编写一堆代码来显示小数点可能更有意义百分比,当您需要进行计算时,只需除以 100。

    在我们的特殊情况下,也是我在这里结束的原因,我们希望用户在表单中输入一个很好的百分比值,例如75%。我们总是希望在视图、报告等中显示这个值作为一个很好的干净百分比,比如75%。我们只需要用这个值计算几次。

    因此,在我们的例子中,将值作为百分比存储在数据库中是有意义的。它使保存和查看更加容易,并且只会在我们对其执行计算的几个点中产生“除以 100”的惩罚。

    希望这可以帮助其他人,并为已经写得很好的和接受的答案提供不同的观点。

    感谢@BishmaStornelli 提供另一种观点!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-17
      • 2012-09-25
      • 1970-01-01
      • 1970-01-01
      • 2016-09-26
      • 2011-03-19
      • 2013-03-22
      • 1970-01-01
      相关资源
      最近更新 更多