将价格存储为整数

时间:2013-10-24 14:08:05

标签: ruby-on-rails ruby-on-rails-4

我决定将价格存储为整数,但我对此有困难。

用户当然会以磅和便士的价格输入价格,我想以便士的形式存储,但这样做的最佳方法是什么。

我到目前为止所尝试的是我模型中的before_save

def convert_price
  self.price = self.price * 100
end

但是这有两个问题 - 首先我在我的控制器中使用一个事务(以确保我在保存之前做的其他事情也好)所以它似乎乘以100两次!第二个问题是,如果用户输入56.85,例如,查看终端,它会说输入为56,因为在做其他任何事情之前它将被强制转换为Int。

我不想使用Money gem,因为我觉得它太过分了 - 希望有一个简单明了的解决方案。

1 个答案:

答案 0 :(得分:-1)

只需删除小数点分隔符即可。如果在金额中找不到小数分隔符,则不提供小数,因此只需乘以100。

def convert_price
  if /\./.match(price)
    price.gsub!(/\./, '')
  else
    price *= 100
  end
end

为防止价格多次转换,您可以为价格创建自定义设置器:

def price=(val)
  if /\./.match(val)
    val.gsub!(/\./, '')
  else
    val *= 100
  end
  self.price = val.to_i
end

虽然我不确定这会有效。如果您多次设置相同的价格,它将失败。

最后的话

也许最好的解决方案是使用decimal类型来存储价格。