Railsで同一モデル内で関連を組む

こんにちは!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に紐づく子レコードが取得できるようになります。



勉強になりました。