株式会社学びと成長しくみデザイン研究所の藤澤です。
はじめに
Rails の各 Model 間の関連付けの情報を実装上で取り扱うにあたり、ActiveRecord にはそれを取り出すためのメソッドとその情報を管理するクラスが用意されています。
今回は、以下のような Model を例に説明を進めていきます。
# 1つのAuthorに複数のBookが紐付き、1つのBookに複数のPageが紐づく。
# Author の主キーは code で、Book における外部キーは author_code。
class Author < ApplicationRecord
self.primary_key = :code
has_many :books, foreign_key: :author_code
end
class Book < ApplicationRecord
belongs_to :author, foreign_key: :author_code
has_many :pages
end
class Page < ApplicationRecord
belongs_to :book
end
環境
Rails 7.0.8.1
ActiveRecord::Reflection
ActiveRecord
の関連付け情報を扱うクラス。
内部クラスとして、各関連を表現する AssociationReflection
と、そのサブクラスである HasManyReflection
(has_many 関連)やBelongsToReflection
(belongs_to 関連)などを持つ。
reflect_on_association(association)
レシーバーから見て引数 association
のモデルに対する関連付け情報を取得する。
Book.reflect_on_association(:pages)
# =>(一部省略)
# #<ActiveRecord::Reflection::HasManyReflection
# @active_record=Book,
# @name=:pages,
# @options={}>
reflect_on_all_associations
すべての関連付け情報を配列で取得する。
::reflections
すべての関連付け情報を、各関連名を key
、関連情報を value
とした Hash
で取得する。
Book.reflections
#=> (一部省略)
# {"author"=>
# #<ActiveRecord::Reflection::BelongsToReflection
# @active_record=Book,
# @name=:author,
# @options={:foreign_key=>:author_code}>,
# "pages"=>
# #<ActiveRecord::Reflection::HasManyReflection
# @active_record=Book,
# @name=:pages,
# @options={}}
ActiveRecord::Reflection::AssociationReflection
foreign_key
関連先の外部キーを取得する。
reflection = Author.reflect_on_association(:books)
#=> #<ActiveRecord::Reflection::HasManyReflection>
reflection.foreign_key
#=> "author_code"
active_record_primary_key
関連元の主キーを取得する。
reflection = Author.reflect_on_association(:books)
#=> #<ActiveRecord::Reflection::HasManyReflection>
reflection.active_record_primary_key
#=> "code"
association_primary_key
関連先の主キーを取得する。
reflection = Author.reflect_on_association(:books)
#=> #<ActiveRecord::Reflection::HasManyReflection>
reflection.association_primary_key
#=> "id"