コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

Railsのfind_byは文字列を指定すると使えてしまうので注意

普通に凡ミスしてたのでメモ

やりたかったこと

# パラメータからとってきたID
id = "1"

User.find(id)

実行されるSQLの想定

SELECT  `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1

起きたこと

# パラメータからとってきたID
id = "1"

# タイプミスしてfind_by
User.find_by(id)

期待値としては 『1をfind_byしてもカラム名がないから…』

ArgumentError: Unsupported argument type: 1 (Integer)

となってエラーになるかと思いきや、下のクエリが動く

SELECT  `users`.* FROM `users` WHERE (1) LIMIT 1

しかもそれっぽい結果が帰ってくるので紛らわしい

原理

find_byはこういう使い方もできるから、文字列が引数に来ると勘違いする

User.find_by("id = 1")
User Load (0.4ms)  SELECT  `users`.* FROM `users` WHERE (id = 1) LIMIT 1

ほんと気をつけようというTips