LoginSignup
1
0

ActiveRecord::Reflection で Model 間の関連付け情報を取得する

Posted at

株式会社学びと成長しくみデザイン研究所の藤澤です。

はじめに

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"
1
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
1
0