0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Railsのhas_manyのデフォルトの挙動

Last updated at Posted at 2021-10-03

↓以下のコードを例にします。

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を紐づけてくれます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?