在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)
的列?
在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)
的列?
據我可以在創業板上市的源代碼看,你不能:
# 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
不確定這是一個相關的代碼片段;這個超類有什麼?遷移支持':tinyint'類型。這段代碼是Rails決定忽略你的':integer'類型規範,並且當指定':integer'和':limit'時,使用替代類型來表示更小/更大的整數值。 –
怕你錯了,從add_column調用type_to_sql。你可以在代碼中看到:http://api.rubyonrails.org/v2.3.8/classes/ActiveRecord/ConnectionAdapters/MysqlAdapter.html#M001549 – FedeX
我想我可能會錯誤地認爲是否支持tinyint類型第一個地方(除了間接由於整數和限制組合)。上面的代碼當然是適用的,當類型是整數。 –
對於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
您可以使用:tinyint
作爲軌道移植中的列類型,並編寫limit: 2
或limit: 3
,如前所述。
使用你的例子:
應該工作。
嘿哥們,你不能在遷移中使用tinyint,感染它應該有整數並且限制爲1 – Gagan
首先,MySQL中沒有這樣的東西,如tinyint(4)
。 tinyint
是一個字節的有符號整數。您可以檢查docs中的所有整數類型。即使在Rails source code中,您可能會看到類似tinyint(1)
的內容,但我認爲這是一種重言式,因爲tinyint
已經暗示了一個字節的存儲空間。
在遷移中聲明TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT
的Rails方式是使用limit:
,並使用適當的字節大小,如source code中所示。
請注意,Rails默認將單字節整數視爲布爾值,但從上面的鏈接可以看出。
我不希望你首先使用'tinyint'。它過於具體。我敢冒險猜測它實際上比使用純整數字段的性能要低。它可能爲您節省的記錄數量可以忽略不計,但我甚至不確定是這種情況。我想你會很難說服我,有理由永遠使用它。 –