こんにちは!kossyです!
さて、今回はRailsで同一モデル内で関連を組む方法について、ブログに残してみたいと思います。
環境
Rails 6.0.2.1
Ruby 2.5.1
MacOS Mojave
実装手順
まず、Appointmentモデルがあったとします。
$ rails g model Appointment date:date start_time:time parend_id:bigint
dateカラムとstart_timeカラム、それと同一モデル内で関連を表すための外部キーであるparent_idカラムを作成します。
app/models/appointment.rbの実装は下記のようにします。
class Appointment belongs_to :parent, class_name: :Appointment, optional: true has_one :child, class_name: :Appointment, foreign_key: :parent_id, dependent: :destroy end
belongs_toとhas_oneメソッドで関連を表しています。
class_nameを指定しているのは、指定しなかった場合はchildというモデルを探しに行ってしまうため、
Appointmentをclass_nameとして明示的に指定しています。
foreign_keyオプションは、デフォルトでは外部キーのネーミングがmodel_idと決まっているため、
指定しなかった場合はappointment_idを探しに行ってしまいます。
明示的にparent_idと指定することで、「外部キーはparent_idだよ」とrailsに教えることができます。
こうすることで、appointment.childとするとappointmentに紐づく子レコードが取得できるようになります。
勉強になりました。