Ruby on Rails不会在mysql数据库中存储小数:之后截断数字,

时间:2012-02-04 12:47:30

标签: mysql ruby-on-rails ruby

我遇到了Rails应用程序在我的mysql数据库中存储小数的问题。我有一个包含两个字段的表单:" amount"和"货币"。当我在"中输入一个十进制值"字段(例如1,22)Rails只将1存储在数据库中。

我的日志文件如下所示:

Started POST "/cashamounts" for 127.0.0.1 at 2012-02-04 13:23:54 +0100
  Processing by CashamountsController#create as HTML
  Parameters: {"utf8"=>"✓","authenticity_token"=>"QpWGfEtDR1tc7wTFmZZst9gYjKAyXtRypilsxDE9Tzs=", "cashamount"=>{"currency_id"=>"eur", "amount"=>"1,22"}, "commit"=>"Create Cashamount"}
  [1m[36mCurrency Load (2.8ms)[0m  [1mSELECT `currencies`.* FROM `currencies` ORDER BY name[0m
  [1m[35m (0.2ms)[0m  BEGIN
  [1m[36mSQL (0.3ms)[0m  [1mINSERT INTO `cashamounts` (`amount`, `created_at`, `currency_id`, `updated_at`) VALUES (1, '2012-02-04 12:23:54', 'eur', '2012-02-04 12:23:54')[0m
  [1m[35m (0.6ms)[0m  COMMIT
Redirected to http://localhost:3000/cashamounts/8
Completed 302 Found in 94ms

因此,金额正确存储在参数中,但未正确插入数据库。我检查了我的db / schema.rb文件。列的行"金额"是:

t.decimal  "amount",               :precision => 10, :scale => 2

我还能在哪里找到问题?

PS。我开始使用money gem,但这显示了同样的问题:","之后的所有数字。没有存储。

3 个答案:

答案 0 :(得分:6)

这个问题有点陈旧,但对于未来的访问者,我相信答案可以在以下的“Gotcha”部分找到:

http://torontoprogrammer.ca/2010/05/decimal-numbers-in-rails-and-mysql/

基本上,当你设置十进制字段时,你必须指定scale参数来说明小数点右边应该有多少个位置。否则,mysql假定您希望所有数字都在小数点左侧。

这个问题也让我感到困惑。在我的开发环境(使用sqlite)中一切正常,但在生产中(使用mysql),我的“十进制”数字的小数部分被截断了。

答案 1 :(得分:2)

1,22是十进制值的欧洲表示法,而1.22是英国,美国和澳大利亚的惯例。您可能需要设置语言环境。

http://guides.rubyonrails.org/i18n.html#optional-custom-i18n-configuration-setup

在初始化程序中:

I18n.default_locale = :fr

或者在config / application.rb

的末尾
config.i18n.default_locale = :fr

答案 2 :(得分:0)

问题是Rails需要小数点而不是逗号。如果这是用户输入,请尝试将,替换为.,然后再保存到数据库。