Rails 一日一つメソッド (Day20) Associations-has_manyメソッド
Rails 一日一つメソッド (Day20) Associations-has_manyメソッド
has_manyメソッドとは
一つのモデルが他のモデルの複数のインスタンスと紐付けることを表す。
例えば、Authorが複数のBookを持つ事ができるようにしたい場合、Authorモデルに han_many :booksで作成する。
has_manyメソッド構文
class モデル名 < ActiveRecord::Base
has_many :関連名
end
- 1つのモデルは複数の関連名を持つ。という意味で、has_manyメソッドの引数の関連名は複数形になる。
例題)図書館と本
class Library < ApplicationRecord
has_many :books
end
class Book < ApplicationRecord
belogns_to :library
end
- libraryモデルは has_many :booksを通していろんなBookモデルを紐づけられる。
- Bookモデルは belogns_to :libraryを通して一つの Libraryに属する。
Libraryインスタンスは .booksメソッドを使って連関された全ての Bookインスタンスに接近できる。逆に Bookインスタンスは .libraryを使って Libraryに接近できる。
has_manyのオプション
1) :class_name
- 関係を結ぶモデルのクラス名が基本ルール(モデル名の複数形)と異なる場合に使用します。
class Library < ApplicationRecord
has_many :books, class_name: "BookShop"
end
2) :foreign_key
- ForeignKeyの名前が慣例と異なる時に使う。関係を結ぶモデルで探すforeignKeyを名詞する。
class Library < ApplicationRecord
has_many :comments, foregin_key: "author_id"
end
3) :primary_key
- 関係を結ぶモデルの主キーが基本値(id)と異なる場合に使う。
class Library < ApplicationRecord
has_many :articles, primary_key: "guid"
end
4) :dependent
- :destroy, :nullify, :restrict_with_exception, :restrict_with_error などの :dependent:関連オブジェクトのライフサイクルを管理する。
class Library < ApplicationRecord
has_many :comments, dependent: :destroy
end
5) :through
- 他のモデルを通して間接的関係を設定する。
class Library < ApplicationRecord
has_many :tags, through: :taggings
end
6) :conditions
- 特定の条件に合うオブジェクトをリータンする。
class Library < ApplicationRecord
has_many :published_posts, -> { where(published: true) }, class_name: "Post"
end
7) :inverse_of
- 関係の逆方向を名詞して性能を向上させる。
class Library < ApplicationRecord
has_many :comments, inverse_of: :post
end