特定の親モデルを持たずに、いろいろな親モデルを持つことができる関連付けの仕組みをポリモーフィックといいます。以下はコメントの親モデルが複数の場合のクラス図です。青枠部分はポリモーフィックを使う場合に必要な属性です。
上記の属性について、データベース構造を確認しながら学びましょう。まず、commentable_typeは親のモデル名を記録する為の属性です。そして、commentable_idは親モデルレコードのIDを記録する為の属性です。この2つを属性として持つことで、特定の親モデルを設定しなくても関連性を持たせることが可能になるのです。
ポリモーフィックを使用する場合の、scaffoldは以下のように行います。ターミナルで以下コマンドを実行して下さい。
$ rails g scaffold Comment body:text user:references commentable:references{polymorphic}
$ rails db:migrate
モデルに関連付けを設定します。ポリモーフィックの関連付けに注目して下さい。ポリモーフィックの場合はhas_manyに続けてas: commentableというように記述します。また、子となるモデルではbelongs_to :commentable, polymorphic: trueという記述が必要です。
# article.rb
has_many :comments, as: :commentable
# opinion.rb
has_many :comments, as: :commentable
# comment.rb
belongs_to :user
belongs_to :commentable, polymorphic: true
コンソールを立ち上げて、コメントを作成してみましょう。commentable_typeに注目して下さい。親モデルの名前が記録されていますね。
$ rails c
> user = User.first
> article = Article.first
> opinion = Opinion.first
> comment1 = article.comments.create(body: 'artcle body', user: user)
> comment1 #=> commentable_type: "Article"
commentable_id: 1が含まれている
> comment2 = opinion.comments.create(body: 'artcle body', user: user)
> comment2 #=> commentable_type: "Opinion"
commentable_id: 1が含まれている
無料ビデオ講座のお知らせ
Skillhub [スキルハブ]では無料の動画講座を多数公開しています。他校だと数万円するような講座が無料で受講できます。