如何在Ruby on Rails中创建tinyint(2)或tinyint(3)类型的列?

时间:2014-01-30 01:48:02

标签: mysql ruby-on-rails rails-migrations tinyint

在Ruby on Rails中,迁移中的以下代码在MySQL中创建了一个类型为tinyint(4)的列:

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

如何创建tinyint(2)tinyint(3)类型的列?

4 个答案:

答案 0 :(得分:15)

对于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

答案 1 :(得分:3)

根据我在gem的源代码中可以看到的内容,你不能:

     # 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

答案 2 :(得分:2)

首先,MySQL中没有tinyint(4)这样的东西。 tinyint是一个单字节有符号整数。您可以检查docs中的所有整数类型。你甚至可以在Rails source code中看到类似tinyint(1)的内容,但我认为这是一个重言式,因为tinyint已经暗示了一个字节存储。

在迁移中声明TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT的Rails方法是使用limit:并使用适当的字节大小,如source code中所示。

请注意,默认情况下,Rails会将一个字节的整数视为布尔值,如上面的链接所示。

答案 3 :(得分:1)

您可以在rails迁移中使用:tinyint作为列类型,并按照之前的说明编写limit: 2limit: 3

使用您的示例:

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

应该有用。