Rails モデルについて学ぶ(Active Record)

Rails は、MVCアーキテクチャを採用している。MVCアーキテクチャとは、プログラムをモデル(Model)、ビュー(View)、コントローラー(Controller)の3つに分けて設計する手法のこと。

モデル(M)の役割は、データベースとのやり取り。

命名ルール

モデル名は、Bookのように単数形が基本。Rails の規約に従っておけば、自動的に Book モデルに紐づくデータベースのテーブル名はモデル名を複数形にした books テーブルとなる。2単語以上の場合はキャメルケースで書く(モデル名:LineItem、テーブル名:line_items)。

Active Record

モデルは、ApplicationRecord クラスを継承している。ApplicationRecord は、ActiveRecord::Base を継承している。(注:Active Record を使わないモデルも作れるがこの記事では触れない)

Active Record はモデルの重要な役割を担う Railsコンポーネントの一つで、データベースのテーブルとモデルとの関連付けを行う。このような関連付けの仕組みを一般的に ORM という。ORM(Object-Relational Mapping)により、データベース内のレコードをオブジェクトのように扱うことができる。具体的には、モデルのメソッドを使うことで SQL 文が発行され、モデルを通してデータベースを操作することができる。

ORMフレームワークとしてのActive Record

  • モデルおよびモデル内のデータを表現する
  • モデル同士の関連付け(アソシエーション)を表現する
  • 関連付けられているモデル間の継承階層を表現する
  • データをデータベースで永続化する前にバリデーション(検証)を行なう
  • データベースをオブジェクト指向スタイルで操作する

Active Recordの基礎 - Railsガイド

Book モデルを定義するコードの例

class Book < ApplicationRecord
end

上のように、モデル定義でメソッドを何も書いていなくてもテーブルのカラム名と同じ名前のインスタンス変数やallfind_bywheredestroyなどのメソッドを使えるのは Active Record のおかげだ。

CRUD

CRUD(クラッド)とは、ソフトウェアが持つべき機能の基本機能「Create」「Read」「Update」「Delete」の頭字語。Active Record が CRUD のメソッドを提供してくれるので、モデルを通してデータの読み書きができる。実際に使えるメソッドには以下のようなものがある。

Create(レコードを作る)

  • create
  • save

Read(レコードを参照する)

  • find
  • first
  • last
  • all
  • where
  • find_by

Update(レコードを更新する)

  • update
  • update_all

Delete(レコードを削除する)

  • destroy
  • destroy_by
  • destroy_all
  • delete

など。CRUD 関係以外のメソッドもあるので、いずれまとめたい。

マイグレーション

マイグレーションは Active Record の機能の一つで、DSLドメイン固有言語:特定のタスクのために設計されたコンピュータ言語)を使ってデータベースを統一的かつ簡単に管理するための仕組み。英単語の migration は「移行」という意味。

マイグレーションは特定の SQL 言語に依存しないので、以下のようなわかりやすいコードでデータベースを操作することができる。実際には、このコードをもとに Active Record が SQL 文を発行してデータベースが操作される。

class CreateBooks < ActiveRecord::Migration[6.0]
  def change
    create_table :books do |t|
      t.string :title
      t.text :memo

      t.timestamps
    end
  end
end

(参考資料)独習Ruby on Rails

(前書いた記事)