Как создать столбец типа tinyint(2) или tinyint(3) в Ruby on Rails?

В Ruby on Rails следующий код в миграции создает столбец типа tinyint(4) в MySQL:

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

Как бы я создать столбец типа tinyint(2) или же tinyint(3)?

4 ответа

Для миниатюр (2)

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

Для миниатюр (3)

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

Согласно тому, что я могу видеть в исходном коде драгоценного камня, вы не можете:

     # 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

Там нет такого понятия, как tinyint(4) в MySQL в первую очередь. tinyint однобайтовое целое число со знаком Вы можете проверить все целочисленные типы в документах. Вы можете увидеть что-то вроде tinyint(1) даже в исходном коде Rails, но я думаю, что это тавтология как tinyint уже подразумевает одно байтовое хранилище.

Rails способ объявить TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT в миграции с помощью limit: с соответствующим размером байта, как видно из исходного кода.

Помните, что Rails по умолчанию будет воспринимать однобайтовые целые числа как булевы, как видно из приведенной выше ссылки.

Ты можешь использовать :tinyint as the column type in a rails migration, and write limit: 2 или же limit: 3 as written before.

Используя ваш пример:

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

должно сработать.

Другие вопросы по тегам