web-dev-qa-db-ja.com

RailsのRuby)にtinyint(2)またはtinyint(3)型の列を作成するにはどうすればよいですか?

RailsのRuby)では、移行の次のコードにより、MySQLでタイプtinyint(4)の列が作成されます。

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

タイプtinyint(2)またはtinyint(3)の列を作成するにはどうすればよいですか?

13
maxedison

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
18
srbhattarai

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

5
FedeX

そもそもMySQLにはtinyint(4)のようなものはありません。 tinyintは1バイトの符号付き整数です。 docs ですべての整数型を確認できます。 Rails ソースコード でもtinyint(1)のようなものが表示される場合がありますが、tinyintがすでに示唆しているように、これはトートロジーだと思います1バイトのストレージ。

移行でTINYINT, SMALLINT, MEDIUMINT, INT, BIGINTを宣言するRails方法は、 ソースコード に見られるように、適切なバイトサイズでlimit:を使用することです。 。

ただし、上記のリンクからわかるように、Railsは、デフォルトで1バイトの整数をブール値として扱うことに注意してください。

2
petkov.np

Railsマイグレーションでは、列タイプとして:tinyintを使用し、前に記述したようにlimit: 2またはlimit: 3を書き込むことができます。

あなたの例を使用して:

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

動作するはずです。

1
adamszkly