ruby-on-rails - 我应该如何向用户呈现成本字段并将其存储在数据库中?

标签 ruby-on-rails ruby database

现在我有两个成本字段。一种用于美元,一种用于美分。这可行,但有点难看。如果他们愿意,它也不允许用户输入术语“免费”或“免费”。但如果我只有一个字段,我可能必须让我的解析器更智能一些。你怎么看?

在服务器端,我将美元和美分组合起来,以小数形式将它们存储在我的数据库中。主要是为了快速收集统计数据(平均成本等)。

你认为将成本存储为字符串更好吗?然后,每当我实际将成本用于统计或其他目的时,我都会在那时将其转换为小数。还是我在正确的 rails 上?

最佳答案

数据库设计中有一条规则,规定“原子数据”不应拆分。根据这条规则,价格或成本就是原子数据的一个例子,因此它永远不应该在多列之间拆分,就像你不应该在多列之间拆分电话号码一样(除非你真的有一个很好的理由 -非常罕见)

使用 DECIMAL 数据类型。像 DECIMAL(8,3) 这样的东西应该可以工作,并且所有符合 ANSI SQL 的数据库产品都支持它!

可以咨询Joe Celko的"Thinking In Sets"讨论这个话题的书。参见 section 1.6.2, pages 21-22 .

编辑 - 从您的问题看来,您似乎还关心如何以类似于价格 (xxxx.xx) 的形式接受用户的输入 - 因此有两个输入框,分别是美元和便士。

我建议使用单个输入框,然后使用正则表达式进行输入验证以匹配您的格式(即类似于 [0-9]+(.[0-9]{1,3} )? 可能会起作用,但可以改进)。然后,您可以将经过验证的字符串解析为您的语言中的 Decimal 类型,或者只是将其作为字符串传递到您的数据库中——SQL 将知道如何将其转换为 DECIMAL 类型。

关于ruby-on-rails - 我应该如何向用户呈现成本字段并将其存储在数据库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/803342/

相关文章:

ruby-on-rails - RSpec 路由规范 POST 请求问题

Ruby 转置 csv

ruby-on-rails - 从查询中保存新对象

ruby-on-rails - Rails : Thread. 请求范围数据共享的当前哈希

ruby - 在 TextMate 中使用 RVM 和不同的 gemsets

ruby - 我无法运行 compass watch

android - 同步 SQLite 数据库和 Dropbox 数据存储

PHP bin2hex 与 mysql

database - 我应该对我的 postgres 表进行分区吗?

ruby-on-rails - 将 Rails cookie 设置为在 1 天内过期