active recordでtinyint(1)がbooleanではない形式を扱う

ActiveRecordを使っていて、tinyint(1)なレコードの取り扱いにちょっとハマったので備忘録。

MySQLでtinyint(1)はbooleanと同じなので 0 か 1 しかとらないはずだが、
今回はなぜか2なる値があり、常にfalseとなっていた。

これはActiveRecord::ConnectionAdapters::AbstractMysqlAdapter#emulate_booleansが使われれるため。

あまりないけど、こういう場合は以下の方法で解決出来る。

Railsアプリケーション全体でこの設定を使わない場合

または、Model単位ではキャストする

ちゃんとソースにコメント書いてあるんで比較的常識的なことだったんですね…。

参考にしたページ
rails/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb
rails/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb

Comments