Rails ActiveRecordのwhereで想定しないデータが取得される
はまったこと
# id='2a2' model = model.where(relation_id: id)
を実行するとrelation_idが2のデータが取得される。
実行されたSQL
select model.* from model where model.relation_id = 2
原因はto_iメソッド
relation_idはinteger型なので、idがstring型だった時はwhereメソッド実行時にid.to_iが実行されidが数値に変換されます。
string.to_iメソッドは文字列を数値に変換しますが、'2a2'など、文字列と数値が混在しているときは先頭から数値に出来る部分までを切り出して数値化するようです。
'2a2'.to_i # => 2 '25a'.to_i # => 25