↓以下のコードを例にします。
class User < ApplicationRecord
has_many :microposts, dependent: :destroy
end
「has_many :microposts, dependent: :destroy」とするとUserモデルとMicropostモデルを1対多の関係に紐づけてくれますが、特に**「Micropost」**という記述がなくても動作します。これはデフォルトの挙動のおかげです。
デフォルトでは、「:microposts」の部分を**「{モデル名}s」と推測します。
つまり「:microposts」⇨ 「{Micropost}s」**としMicropostモデルと紐づければいよいとrailsが理解してくれます。
紐づけるキー、つまりforeign_keyに関しても**「{モデル名}_id」がforeign_keyであると推測してくれます。
今回だと、「user_id」**がforeign_keyであると推測します。
class User < ApplicationRecord
has_many :microposts, dependent: :destroy
#Default: class_name: "Micropost"
#Default: foreign_key: "user_id"
end
これがデフォルトの挙動です。
####反対に、has_manyの第一引数が「{モデル名}s」でない場合やforeign_keyが「{モデル名}_id」でない場合はrailsに明示的に伝える必要があります。↓
class User < ApplicationRecord
has_many :active_relationships, class_name: "Relationship",
foreign_key: "follower_id",
dependent: :destroy
end
ちなみにdependent: :destroyとすると、userモデルのデータが削除されると紐付けられているデータも一緒に削除してくます。
##belogn_toのデフォルトの挙動は?
下のコードを例にします。
class Micropost < ApplicationRecord
belongs_to :user
#:user → UserモデルのidとMicropostモデルのuser_idを紐づける
end
↑デフォルトではシンボルで書いた引数名(:user)から紐づける先のモデル名と、そのモデルと紐づけるカラムを推測します。
:userであれば、
Userクラスのidとuser_idを紐づけてくれます。
####シンボルで書いた引数名とモデル名が一致しなければ、クラス名を書く必要があります。
class Relationship < ApplicationRecord
belongs_to :follower, class_name: "User"
end
↑この場合、Userモデルとfollower_idを紐づけてくれます。