2011-05-15 23 views
9

我的一個應用程序中有一個奇怪的錯誤。Rails 3並從表格中保存十進制值

當我使用sqlite3數據庫的錯誤不存在。但是,當我使用mysql2作爲數據庫適配器時,遇到了保存表單中的十進制值的錯誤。

如果我提交值19.99我輸入小數點被刪除後,它被存儲在數據庫中的19.00

什麼會導致此?該數據庫具有正確的列設置,我可以使用導軌控制檯創建正確的記錄。

編輯:說的整數,當我真的想說小數。

+0

正在在正確保存的值mysql表? – Zabba 2011-05-15 04:41:44

+0

不,它被正確地提交給mysql,據我所知,從rails日誌。我會看看是否可以用sscirrus的解決方案再次編輯我的遷移,並確保一切正確。 – 2011-05-15 05:19:10

回答

14

我認爲這可能是這些可能性之一:

  1. 在Rails模型的確認(或在控制器中的一些步驟)的值設置爲一個整數,或至少截斷小數,在保存到數據庫之前。要看到,如果是這種情況,請檢查您INSERT運行在你的日誌,看看什麼樣的數據Rails正在試圖來插嘴說。

  2. 如果Rails正在發送19.99而不是19.00,你極有可能之間存在細微的差異數據類型在你的兩個數據庫中。請檢查您的MySQL數據庫是否僅存儲小數點,其刻度爲2或更高級別。 MySQL默認存儲數據類型,精度爲10,刻度爲0,因此不存儲小數。

如果#2的問題,解決的辦法就是生成遷移和「改變」的字段類型指定一個規模,是這樣的:

# 'up' portion of a new migration 
def self.up 
    change_column :mymodel, :myfield, :decimal, :precision => 6, :scale => 2 
end 
+0

謝謝!你救了我,把我的頭髮撕掉了。我必須在我的移民中有一個錯字,或者沒有像我應該的那樣徹底檢查某些東西。解決方案是在我的遷移中將精度=> 6,:scale => 2添加到列定義的末尾。 – 2011-05-15 05:25:02

+0

@DevinM - 非常歡迎您! – sscirrus 2011-05-15 05:25:46

+1

如果在同一個表中有一堆列需要更改,您可能還會喜歡這種其他語法:change_table:mymodel do | t | t.change:myfield,:decimal,:precision => 6,:scale => 2 – 2011-06-23 19:16:00