6

Rails 3.0.5 を使用しています。MySQL をデータベース ストレージとして使用しています。列の 1 つを BIGINT にする必要があるモデルがあります。移行ファイルの作成で次を使用しています。

t.column  :my_column_name,       :bigint

これは正常に動作します。

ただし、実行すると

rake db:移行

生成された「schema.rb」ファイルは、特定の列に対して次の行を作成します。

t.integer  "my_column_name",       :limit => 8

これは正しくありません。

私の質問は、それのどこが間違っているのですか? 正しい「schema.rb」ファイルを取得するために私がすべきことはありますか? 「schema.rb」ファイルの生成方法を変更できますか?

「schema.rb」ファイルが間違っているという事実は、テストを実行し、「schema.rb」ファイルを使用して (テストを実行する前に) 最初からデータベースを作成する継続的インテグレーション サーバーに問題を引き起こすことに注意してください。

4

1 に答える 1

9

私は今それを理解しています

t.integer "my_column_name", :limit => 8

mysql ドライバーを使用すると、schema.rb ファイルで正しいです。

「schema.rb」ファイルを使用して生成されたデータベースは、

bigint(20)

これは奇妙に思えるかもしれませんが。

これは、my_sql アダプターのコードを調査することでわかりました。そのスニペットをここで引用します。

 def type_to_sql(type, limit = nil, precision = nil, scale = nil)
       return super unless type.to_s == 'integer'
        case limit
        when 1; 'tinyint'
        when 2; 'smallint'
        when 3; 'mediumint'
        when nil, 4, 11; 'int(11)'  # compatibility with MySQL default
        when 5..8; 'bigint'
        else raise(ActiveRecordError, "No integer type has byte size #{limit}")
        end
      end

:limit => 8 が mysql db に bigint を作成することになることは明らかです。

于 2011-03-16T15:32:07.033 に答える