2014-01-30 38 views
6

在Ruby on Rails的,在遷移下面的代碼創建tinyint(4)類型的MySQL中的列:如何在Ruby on Rails中創建tinyint(2)或tinyint(3)類型的列?

create_table :great_table do |t| 
    t.integer :step_position, :limit => 1 #tinyint 
end 

我將如何創建tinyint(2)型或tinyint(3)的列?

+1

我不希望你首先使用'tinyint'。它過於具體。我敢冒險猜測它實際上比使用純整數字段的性能要低。它可能爲您節省的記錄數量可以忽略不計,但我甚至不確定是這種情況。我想你會很難說服我,有理由永遠使用它。 –

回答

0

據我可以在創業板上市的源代碼看,你不能:

 # File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 540 
    540:  def type_to_sql(type, limit = nil, precision = nil, scale = nil) 
    541:   return super unless type.to_s == 'integer' 
    542: 
    543:   case limit 
    544:   when 1; 'tinyint' 
    545:   when 2; 'smallint' 
    546:   when 3; 'mediumint' 
    547:   when nil, 4, 11; 'int(11)' # compatibility with MySQL default 
    548:   when 5..8; 'bigint' 
    549:   else raise(ActiveRecordError, "No integer type has byte size #{limit}") 
    550:   end 
    551:  end 

type_to_sql

+0

不確定這是一個相關的代碼片段;這個超類有什麼?遷移支持':tinyint'類型。這段代碼是Rails決定忽略你的':integer'類型規範,並且當指定':integer'和':limit'時,使用替代類型來表示更小/更大的整數值。 –

+0

怕你錯了,從add_column調用type_to_sql。你可以在代碼中看到:http://api.rubyonrails.org/v2.3.8/classes/ActiveRecord/ConnectionAdapters/MysqlAdapter.html#M001549 – FedeX

+0

我想我可能會錯誤地認爲是否支持tinyint類型第一個地方(除了間接由於整數和限制組合)。上面的代碼當然是適用的,當類型是整數。 –

9

對於TINYINT(2)

create_table :great_table do |t| 
    t.integer :step_position, :limit => 2 
end 

對於TINYINT( 3)

create_table :great_table do |t| 
    t.integer :step_position, :limit => 3 
end 
0

您可以使用:tinyint作爲軌道移植中的列類型,並編寫limit: 2limit: 3,如前所述。

使用你的例子:

應該工作。

+0

嘿哥們,你不能在遷移中使用tinyint,感染它應該有整數並且限制爲1 – Gagan

1

首先,MySQL中沒有這樣的東西,如tinyint(4)tinyint是一個字節的有符號整數。您可以檢查docs中的所有整數類型。即使在Rails source code中,您可能會看到類似tinyint(1)的內容,但我認爲這是一種重言式,因爲tinyint已經暗示了一個字節的存儲空間。

在遷移中聲明TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT的Rails方式是使用limit:,並使用適當的字節大小,如source code中所示。

請注意,Rails默認將單字節整數視爲布爾值,但從上面的鏈接可以看出。