2015年2月3日火曜日

Ruby on Rails の ActiveRecord でドハマリした話 - リフレクションとかsendメソッドとか

簡潔に

Rubyにはsendメソッドという(Java等で言う)リフレクション用メソッドが存在する

sendメソッドはObjectから継承されるのですべてのオブジェクトはsendメソッドを持つ

ActiveRecordでModelを作るときに送り先の意味でsendカラムを指定した場合、 上記のsendメソッドによってModel作成時のアクセスがおかしくなってしぬ

なにをしようとしたか?

ActiveRecordのModelを作る際にカラム名に「send」を指定した。

何が起きたか?

ArgumentError (wrong number of arguments (2 for 0))

がモデルのnewやcreate等で起き、ログに記録される。

rails cで同様にnew等をすると意味の分からない箇所でエラーが起きているように見える(具体的なログは失われてしまった…)。

対処法は?

sendという名前のカラムを作らない。

sendという名前のカラムがある場合は変える。

すでにあって変えられない場合はどうしたらいいのか私はわからない。

きっとカラム名とModelのシンボルを変換してくれる指定をする何かがあると思う。

どうでもいい話

あとsendってのは動詞なので、カラム名に使っていいものではない。この命名をしたときの私はとても疲労していたが、だからといって動詞をカラム名につけてはいけない。

カラム名には名詞を使おう。少なくとも動詞はやめよう。英語力を付けよう。そう思った。あと疲れているときに無理にコードを書くのはやめよう。いや、無理をしなくてはいけないことも、あるけれど。