2016-10-11 15 views
2

Rails 4.2.1 mysql2 gemを使用しています。 ActiveRecordはデータ型がtinyint(1)のmysql列をブール値として扱います。しかし、私は小さな数字として使用したい - 私はtinyint(1)のための大丈夫です100までの値を格納したい。私はレコードを作成しようとすると、tinyint型の列にはfalseにキャストし、私は、減価償却の警告を取得:Railsはmysql tinyint(1)をブール値と見なしますが、数字であることが必要です

> Foo.create(my_tinyint_col: 13) 
    (0.2ms) BEGIN 
    SQL (0.5ms) INSERT INTO `foos` (`my_tinyint_col`) VALUES (0) 
    (107.3ms) COMMIT 
    => #<Foo ID: 519, my_tinyint_col: false> 

DEPRECATION警告:あなたはブールへ 明示的truefalseない値を割り当てようとしましたカラム。現在のところ、 の値はfalseにキャストされます。これはRubyのセマンティクスに合わせて変更され、 の動作を維持したい場合は、 からfalseにキャストしたい値を明示的に処理する必要があります。

私はtinyint(2)my_tinyint_colのデータ定義を変更した場合、問題は消える - しかし、ActiveRecordのを使用して数値としてtinyint(1)を治療する方法はありますか?

+0

なぜ1バイトごとに騒がしいのですか?何十億というレコードがありますか? – tadman

答えて

3

tinyint(1)booleanと表示され、Hibernateと表示される場合にも同じ問題が発生します。トリックはtinyint(1)を使用するのではなく、tinyint(4)を使用することです。そうすることで、RoRはブール値であるとはみなされません。

いずれにしても、実際にはtinyint(1)tinyint(2)の間には、MySQLには違いがありません。両方とも同じ値を保持できます - 1と2は符号化されたcolumn widthのみです。

See this please

関連する問題