true do |t| t.string "rep-6ren">
gpt4 book ai didi

ruby-on-rails - 为什么 postgreSQL 将小数字段存储为 BigDecimal 哈希?

转载 作者:行者123 更新时间:2023-11-29 11:33:01 26 4
gpt4 key购买 nike

我在 rails3/postgreSQL 中有以下模型/表:

create_table "admin_reports", :force => true do |t|
t.string "report"
t.decimal "result"
t.string "result_type"
t.datetime "created_at"
t.datetime "updated_at"
end

在生产环境中,AdminReports.result 存储的不是小数而是哈希值:

AdminReport.last

=> #<AdminReport id: 4, report: "dau", result: #<BigDecimal:cbca0f0,'0.8E1',4(8)>, result_type: "percentage", created_at: "2012-02-28 22:05:15", updated_at: "2012-02-28 22:05:15">

我希望看到的地方:

AdminReport.last

=> #<AdminReport id: 4, report: "dau", result: 10.10, result_type: "percentage", created_at: "2012-02-28 22:05:15", updated_at: "2012-02-28 22:05:15">

在 Rails 控制台中,即使我尝试像这样手动设置结果字段:

@a = AdminReport.last
@a.result = 8.89
@a.save

它仍然将 AdminReport.result 显示为 BigDecimal 哈希。知道这里发生了什么吗?

谢谢

最佳答案

您正在使用小数列:

create_table "admin_reports", :force => true do |t|
#...
t.decimal "result"
#...
end

这通常意味着您希望使用固定的小数位数,因此您可能还希望指定 :precision:scale 选项。当 ActiveRecord 看到小数列时,它会将值转换为 Ruby 的 BigDecimal,这样您就可以在 Ruby 领域中保持所需的小数位数;如果 AR 使用浮点值,那么你会遇到所有常见的浮点问题,你最终可能会从数据库中提取一个值,然后将另一个值放回而不刻意更改,使用BigDecimal 完全避免了这个问题。

当你看到这个时:

#<BigDecimal:cbca0f0,'0.8E1',4(8)>

您只是看到了 BigDecimal 的标准 inspect 输出。如果您使用 to_s(或 "#{...}"),您会看到更熟悉的内容。

所以没有什么可担心的。如果您需要使用非整数运算但又不想遇到所有 float 问题,那么小数列(使用 :precision:scale)是正确的选择.

关于ruby-on-rails - 为什么 postgreSQL 将小数字段存储为 BigDecimal 哈希?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9490539/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com