起きたこと
・既存のプロジェクトにメール機能を追加するにあたって、Mailモデルを作成して実装
・順調に開発が進み本番環境にデプロイしたところ、NoMethodErrorが発生
【エラー内容】
undefined method `eager_autoload!' for Mail (call 'Mail.connection' to establish a connection):Class (NoMethodError)
Did you mean? eager_load
原因
・Rails の初期化プロセスでActionMailerのeager_loadを実行
・その中で Mail.eager_autoload! を呼んでいる(どうやらMailモデルがあるみたい)
・しかし自身が作成したMailクラスにはeager_autoload!が存在しない → NoMethodError
なぜ開発環境では起きなかったの?
・development.rbではconfig.eager_load = false
となっておりproduction.rbではこれがtrue
だったので開発環境では発生しなかった。
反省
・安易にモデル名を決めてしまった(後になって思えば流石にMailモデルはどこかで使われている可能性が高そう)
・Railsの継承元のモデル名も干渉するという視点がなかった
終わりに
・モデル名の変更により実装した部分の大多数を変更後のモデル名で書き直す必要がありかなり時間と労力を使ったので二度と同じ過ちは繰り返したくない。。
余談
・関連するモデルでMailMediaというモデルを作っていたが、スキーマファイルを作成する際、mail_mediasというテーブル名で作成していたところ、mail.mail_medias
を呼び出す際に「mail_mediaなんてテーブルはない」というエラーが発生していた。
・調べるとmediaの複数形はmediaなので、Railsさんが自動的に複数形変換してくれてmail_mediaテーブルを探しに行ってくれてたってわけ。
・今回は運用のしやすさという観点からself.table_name = 'mail_medias'
をMailMediaモデルに記述して対応