6時だョ!!全員集合!!

Rails・JavaScrictを中心にアウトプットします。

2022年5月10日 Railsガイド ポリモーフィック関連付け

ポリモーフィック関連付けとは

ある一つのモデルが複数のモデルと関連付けがある事をpolymorphic: trueと1つの関連付けのみで示すことができます。モデルにポリモーフィック関連付けを行なった場合、データベースにもテーブル同士の関連付けがある事をマイグレーションファイルを通して伝える必要があります。

ポリモーフィックを設定するにはマイグレーションでpolymorphic関連付けを行うための外部キーを設定し、モデル側でそのbelongs_to: 外部キー名としpolymorphicをtrueに設定することで一括でhas_manyとの関連付けを行うことが出来ます。has_manyにはasオプションで外部キーとの紐付けを行う必要があります。

関連付けを行う時にモデルとマイグレーションファイルにそれぞれ設定を記述する必要があるのは、モデルとマイグレーションファイル同士の直接の関係性はないためです。

モデルにアソシエーションを設定するとSQLを使わずRailsのメソッドを使うことでデータを取得することができるようになり、DBに設定を行うと関連付けのあるデータを取得・格納できるようになります。

◆ マイグレーション
class CreatePictures < ActiveRecord::Migration[5.2]
  def change
    create_table :pictures do |t|
      t.string  :name
      t.references :imageable, polymorphic: true
      t.timestamps
    end
  end
end
  • imageable_idとimageable_typeの外部キーを通して、アソシエーション関係を構築しています。
◆ モデル
class Picture < ApplicationRecord
  belongs_to :imageable, polymorphic: true
end

class Employee < ApplicationRecord
  has_many :pictures, as: :imageable
end

class Product < ApplicationRecord
  has_many :pictures, as: :imageable
end

例)

オンラインの塾があるとします。
アニキ先生に100人の生徒がbelongs toを記述して紐づいています。belongs toという記述を1つ1つ100人分書くのではなく、polymorphic: trueとasオプションを書くことで一度に100人の受講生が塾の生徒であるということを証明できるようになります。

モデルとは

モデルは、データベースや外部サービスへのアクセスをはじめ、ビジネスロジック全般を担当します。
また、データの取得や追加、更新など データベースとのやりとりを行います。
モデルにバリデーションをつけた場合、モデルを経由したデータベースとのやりとり時にバリデーションチェックが行われ、制約を満たさないものは弾かれます。

後述していますが、RailsではActive Recordを継承しているためデータベースとのやりとりを通常はSQLで行うところをRailsのメソッドで行えます。

マイグレーションファイルとは

Railsにおけるデータベースのテーブルを作成、追加、削除などの操作を行うための指示書です。
モデルの設定とは別に外部キー制約やNOTNULL制約を行うことが出来ます。
rails db:migrate を実行することで実際にテーブルに指示が反映されます。 schema.rbでデータベース内の構造を確認することが出来ます。

モデルとマイグレーションファイルの関係性

モデルとマイグレーションファイルどちらもデータベースとやりとりをします。しかし、モデルとマイグレーションファイル同士の直接の関係性はありません。

テーブルとは

データを実際に格納している場所のことです。テーブルにNOTNULL制約などをつけた場合、データベースで弾くことが出来ます。
また構造は、以下のようになっています。
データベースサーバー▶スキーマ(データベースのカテゴリ分け)▶テーブル 画像引用

  • NotNull制約はデータベースではじく
  • モデルでpresence: true ではモデルを経由したときにはじく
ORM (オブジェクト/リレーショナルマッピング)とは

ORMを用いると、SQL文を直接書く代わりにわずかなアクセスコードを書くだけで、アプリケーションにおけるオブジェクトの属性やリレーションシップをデータベースに保存することもデータベースから読み出すことも可能にします。

RailsのO/RマッパーはActive Recordというライブラリです。

RailsではActive Recordを継承したクラスを利用することでRubyのコードをSQLに翻訳してやり取りを行ってくれます。 やり取り時に、リレーショナルデータベース(表形式のデータ)は、あたかもオブジェクトであるかのように操作できます。 画像引用

参考

Railsガイド-ポリモーフィック関連付け

Railsガイド-Active Record の基礎

書籍転載:Ruby on Rails 4アプリケーションプログラミング-モデルの基本