Hit the books!!

プログラミング学習記録

モデルの役割

改めて、データベースとやりとりする役割を持つモデルについて。

参考

モデルの役割

モデルとActive Record

モデル名は通常、先頭が大文字の単数形で表し、次のように記述する。

class モデル名 < ApplicationRecord
end

モデルはApplicationRecordクラスを継承したクラスオブジェクトで、ApplicationRecordはActiveRecord::Baseを継承しているクラスである。

irb(main):001:0> ApplicationRecord.superclass
=> ActiveRecord::Base

ActiveRecord::Baseはデータベースを操作するための多くのメソッドを有している。

モデルの役割は、アプリケーションに必要なものを実体であるインスタンスとして生み出すことである。図書管理アプリケーションに例えると、図書モデルや借り主モデルだけでなく、貸し出す手続きそのものも、貸し出しを記録するもの(台帳)という実体である。つまり、モデルの役割を理解することは、モデルのインスタンスをどのように用意し利用するかを知ることである。

実際にモデルをインスタンス化し、利用するのはコントローラーであるが、コントローラーがなければモデルは何もできないわけではない。Railsコンソールを使えばモデルに対して直接操作ができる。

Active Recordの役割

Active Recordとは、前回書いた通りモデルの重要な役割を担うRailsコンポーネントのひとつで、具体的には、データベースとモデルの関連付けを行っている。

ud-ike.hatenablog.com

このような関連付けの役割を果たす仕組みを一般的にORM(Object-Relational Mapping)といい、Active RecordはRailsが提供するORMであるといえる。

通常、データベースを操作するにはSQL文という言語を使用するが、SQL文は使用するデータベースごとに方言がある。ORMは、その方言による違いを一手に引き受けて共通語のメソッドで利用できるようにしている、という役割を果たしている。

Active Recordはテーブルの1行(1件のデータリソース)を1つのモデルのインスタンスとして生成する。そしてテーブル行の各カラム(項目)の名前と同じメソッドを使って、そのインスタンスが持つ属性とやりとりすることになる。例えばBookモデルのtitle属性はbooksテーブルのtitleカラムに対応しており、Bookモデルのインスタンスはtitleメソッドを使用してタイトルの値を取得できる。→次の項目参照

図書アプリのモデル属性とテーブルカラム

前に作成した図書管理アプリケーションのBookモデルをみてみる。

# app/models/book.rb 

class Book < ApplicationRecord
end

titleやdescriptionといった属性はここには書かれておらず、マイグレーションを行ったときに生成されたスキーマをみると、次のように記述されている。

# db/schema.rb 

ActiveRecord::Schema.define(version: 2020_10_08_094719) do

  create_table "books", force: :cascade do |t|
    t.string "title"
    t.text "description"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end

end

スキーマとは、生成されたデータベースのテーブルを示す情報である。なお、created_atとupdate_atは自動で生成されるカラム。

Railsコンソールを使用して確認すると...

% bin/rails c
Running via Spring preloader in process 1297
Loading development environment (Rails 6.0.3.4)
irb(main):001:0> book = Book.find(1)
   (1.4ms)  SELECT sqlite_version(*)
  Book Load (0.7ms)  SELECT "books".* FROM "books" WHERE "books"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
irb(main):002:0> book.title
=> "独習Ruby on Rails"
irb(main):003:0> book.description
=> "初級者向け"

すでに登録してあるid=1の図書の情報を、findメソッドを使用して取得しインスタンス化している。

モデルに実装される機能

Railsでは、次のようなメソッドを標準でモデルに組み込むことができる。

機能 説明
CRUD操作、コールバックなど データリソースのライフサイクル(新規登録~削除)を実現する
バリデーション データリソースの属性の正当性を保証し正常に保つ
スコープ データリソースの処理の対象範囲を制御する
アソシエーション モデル同士の相互の関係を適切に保つ
ロック機能 データリソース内の整合性を保証する
attributes API データリソースをスマートに管理する

また、データベーステーブルと連携するためのツールとして、以下のものがある。

  • マイグレーション:モデルに紐づくテーブルをデータベースに実現する
  • シード機能:テーブルに初期のデータリソースを供給する

マイグレーションとシード機能について↓

ud-ike.hatenablog.com