はじめに
railsでデータベースのリレーションを行うためにhas_many、belongs_toを用いたところ「NoMethodError」が発生したため備忘録として記録します。
エラー発生部分
movie.rb
class Movie < ApplicationRecord
has_many :schedule
end
schedule.rb
class Schedule < ApplicationRecord
belongs_to :movie
end
MovieテーブルとScheduleテーブルを1対多(1つの映画に複数の上映スケジュールがある)で対応させるためにhas_many、belongs_toで対応させてテストしたところ、「movie.schedules」の部分で以下のエラーが発生しました。
NoMethodError: undefined method `schedules' for
原因
has_many関連付けの相手となるモデルの名前が複数形になっていなかったことが原因でした。
今回の場合、Movieモデルの相手となるScheduleモデルの表記方法を以下のようにすることで、scheduleメソッドを問題なく呼び出せるようになりました。
movie.rb
class Movie < ApplicationRecord
has_many :schedules
end
なお、belongs_to関連付けで指定するモデル名は必ず「単数系」にする必要があります。
「Railsは関連付けの名前から自動的にモデルのクラス名を推測するため、関連付け名が複数形になっていると推測されるクラス名も複数形の誤った形になってしまう」
ことが理由のようです。
参考記事:Railsガイド Active Record の関連付け
まとめ
belongs_to関連付けで指定するモデルは「単数形」、has_many関連付けで指定するモデルは「複数形」にすることを確認する必要があると理解することができました。