我需要在一个名为PackageType的Rails模型中存储一个体积和一个重量。我有两个(链接的)问题:
- 值不能是整数。例如,可能是0.5kg。但是我想避免与float关联的舍入错误:加/乘/除后,我不想冒险得到1.00000001kg(主要是出于会计原因)。
- 我很想将它们存储为一个小单位,它们始终是整数:g和cm3。 (我知道我的包裹不会小于1g / 1cm3)。但这并不是非常用户友好:我的用户需要查看并输入以L(dm3)和kg为单位的值。
我现在发现的解决方案是使用weight_g和volume_cl列:
rails g migration AddVolumeAndWeigthToPackageTypes volume_cm3:integer weight_g:integer
在我的模型中有一些在单位之间转换的方法:
class PackageType < ApplicationRecord
…
def volume_dm3
volume_cm3.to_f / 1000
end
def volume_dm3=(vol)
self.volume_cm3 = (vol*1000).to_i
end
def weight_kg
weight_g.to_f / 1000
end
def weight_kg=(w)
self.weight_g = (w*1000).to_i
end
end
这有效,但感觉不正确,并提出了一些问题:
- 为什么在Rails模型中我可以不使用@表示法访问Model属性?就像我可以仅通过调用volume_cm3而不是self.volume_cm3或@ volume_cm3来读取存储的内容。为什么我可以在不把自我摆在最前面的情况下阅读,但是我需要精确的self.volume_cm3来编写它?
- 这是正确的方法吗?还是我应该放弃此转换并将kg和L直接存储为小数?我真的不希望现在以任何其他单位显示用户,kg和L是我将要使用的唯一单位。我很想只使用小数,kg和L。
- 当您需要存储具有单位的内容时,建议使用什么方式命名数据库列和模型属性?是“ volume”(假定单位),“ volume_dm3”,“ volume_in_dm3”吗?