はじめに
モデルのpolymorphicに関してちょっとまとめます
マイグレーションファイルの作成
commentモデルを下記の様に作成します。
class CreateComments < ActiveRecord::Migration[6.0]
def change
create_table :comments do |t|
t.references :target, null: false, polymorphic: true
t.text :body, null: false
t.timestamps
end
end
end
t.references :target, null: false, polymorphic: true
これによって、target_type
とtarget_id
カラムが追加されます。
target_type
には対象のモデル名が入り、target_id
には対象のデータのidが入ります。
これによって、どのモデルとでも関連を結ぶことができます。
モデルファイルの修正
commentモデルとuserモデルが紐づく場合
commentのモデルファイルには
class Comment < ApplicationRecord
belongs_to :target, polymorphic: true
end
と記載し、userのモデルファイルには
class User < ApplicationRecord
has_many :comments, :as => :target
end
と記載します。
データの作成
user.comments.create(body: 'hello')
この様にしてデータを作成できます。
もちろん、別のモデルでもhas_many :comments, :as => :target
と記載するだけで、紐付けをすることができるので便利です。
終わりに
active storageに関してもこのポリモーフィックを使って、どのモデルに対しても画像を紐付けれる様にしています。