2014-02-12 59 views
2

我有一個像這樣的MySQL中使用Rails的4遷移創建一個表:ActiveRecord的十進制類型字段截斷爲整數

| nba_average_stats | CREATE TABLE `nba_average_stats` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `ppg` decimal(2,0) DEFAULT '0', 
    `apg` decimal(2,0) DEFAULT '0', 
    `rpg` decimal(2,0) DEFAULT '0', 
    `tpm` decimal(2,0) DEFAULT '0', 
    `blk` decimal(2,0) DEFAULT '0', 
    `stl` decimal(2,0) DEFAULT '0', 
    `year` int(11) DEFAULT '0', 
    `player_id` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=414 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci | 

我這裏的問題是,當我做這樣的事情:

stat.ppg = 4.3; stat.save 

它在數據庫中顯示爲整數4

我的數據庫類型是否錯誤?我在Rails上做了什麼錯誤?

回答

0

十進制(2,0)表示您只能存儲整數。

+0

保健佳品的解決方案來解決這個?在我的遷移中,我使用了類似這樣的東西:'t.decimal:ppg,:precision => 2,:default => 0' – randombits

+0

當然是::scale => 1(在點後面有一個地方)。 – Jacek

+0

@Jacek請在答案中提供一個代碼示例。您的評論不夠全面,無法理解答案。 –

1

你想增加小數規模:

https://dev.mysql.com/doc/refman/5.0/en/precision-math-decimal-characteristics.html

| nba_average_stats | CREATE TABLE `nba_average_stats` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `ppg` decimal(2,1) DEFAULT '0', 
    `apg` decimal(2,1) DEFAULT '0', 
    `rpg` decimal(2,1) DEFAULT '0', 
    `tpm` decimal(2,1) DEFAULT '0', 
    `blk` decimal(2,1) DEFAULT '0', 
    `stl` decimal(2,1) DEFAULT '0', 
    `year` int(11) DEFAULT '0', 
    `player_id` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=414 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci | 

decimal第一個參數是精度,第二個參數是規模。精度包含比例,因此精度必須總是大於或等於比例。比例是小數點後的位數。要從上面的示例中存儲值4.3,您至少需要decimal(2,1),這意味着最多2位數,1是十進制後的數字。

將其更改爲decimal(2,1)將允許您將4.3存儲爲4.3而不是舍入到4

既然您提到了Rails 4和遷移,您可以指定精度和比例作爲遷移DSL中小數列類型的可選參數。例如:

add_column :nba_stats, :ppg, :decimal, :precision => 2, :scale => 1

http://guides.rubyonrails.org/active_record_migrations.html#column-modifiers

相關問題