2011-05-15 17 views
9

Uygulamalarımdan birinde tek bir hata var.Rails 3 ve bir formdan ondalık değerleri kaydetme

sqlite3 veritabanını kullanırken hata mevcut değil. Ancak, mysql2'yi veritabanı bağdaştırıcısı olarak kullandığımda, bir formdan ondalık değerlerin kaydedilmesinde bir hata olarak çalışıyorum.

Ben ondalık kaldırıldıktan sonra değeri 19.99 benim giriş teslim ve neden hangi 19.00

olarak veritabanında saklanır varsa? Veritabanı, sütun için doğru ayarlara sahiptir ve raylar konsolunu kullanarak doğru bir kayıt oluşturabilirim.

Düzenleme: Gerçekten ondalık demek istediğimde tamsayı.

+0

doğru kaydediliyor değeri var mı mysql tablosu? – Zabba

+0

Hayır, rayların kayıtlarından görebildiğim kadarıyla mysql'e gönderilir. Göçlerimi tekrar sscirrus'un çözümü ile düzenleyip düzenleyemeyeceğimi ve her şeyin doğru olduğundan emin olup olmadığımı göreceğim. –

cevap

14

Ben bu olasılıklardan biri olabileceğini düşünüyorum:

  1. sizin Raylar modelinde bir doğrulama (veya denetleyicisi bazı adım) bir tamsayı değerini ayarlayarak, ya da en azından, ondalık sayıları kesiliyor edilir veritabanına kaydetmeden önce. Bu durumda bile, günlüklerde sizin INSERT fonksiyonunu ve koymak için çalışıyor hangi verilerin Raylar bkz görmeye.

  2. Raylar 19.00 yerine 19.99 gönderiyorsa, büyük olasılıkla küçük bir farklılık arasında var iki veritabanında veri türleri. MySQL veritabanınızın sadece değerini 2 veya daha yüksek bir ölçeğinde saklamıyor olup olmadığını kontrol edin. MySQL, varsayılan olarak veri tiplerini 10'luk bir hassasiyetle ve 0'lık bir ölçekle depolar, böylece ondalık değerleri depolamamaktadır. 2. Sorun ise

, çözüm gibi göç ve 'değişim' bir ölçek belirtmek için alan türü, bir şeyler üretmektir:

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

Teşekkürler! Saçımı yırttım diye beni kurtardın. Göçümde bir yazım hatası olmalı ya da olması gerektiği gibi bir şeyi kontrol etmemiş olmalıyım. Çözüm şunu eklemekti: geçişlerimdeki sütun tanımının sonuna = precision => 6,: scale => 2. –

+0

@DevinM - en çok hoşgeldin! – sscirrus

+1

Aynı tabloyu değiştirmek için bir sütun sütununuz varsa, bu diğer sözdizimini de beğenebilirsiniz: change_table: mymodel do | t | t.change: myfield,: decimal,: precision => 6,: scale => 2 –