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に翻訳してやり取りを行ってくれます。 やり取り時に、リレーショナルデータベース(表形式のデータ)は、あたかもオブジェクトであるかのように操作できます。 画像引用