※解釈が入り混じっているので不備などがあるかもしれません。予めご了承ください。
※ザックリと理解するというスタンスなのでまとめ方が不十分かもしれません
引用元・参考サイト
Railsガイド
概要
-
Active Record
はMVCのMを相当する『オブジェクト指向 × DB操作』を可能にした仕組み
データ操作をオブジェクトを介して実現可能にしている- ORMというシステム設計パターンを採用しており、ORMではDBの種類ごとのSQLの記述の違いを吸収してくれるなど"互換性が高い"のが大きな特徴
-
Active Record
は次のような特徴を持つ- 先述したSQLでのDB操作をオブジェクトを介して実行可能な点に加えて、『RDBのような"テーブル同士の相関"などよりDB寄りなデータの意味までもオブジェクトで表現できる』
・モデルおよびモデル内のデータを表現する1
・モデル同士の関連付け(アソシエーション)を表現する1
・関連付けられているモデル間の継承階層を表現する1
・データをデータベースで永続化する前にバリデーション(検証)を行なう1
・データベースをオブジェクト指向スタイルで操作する1
RailsはORMシステム設計パターンを採用しているから楽にDB操作ができる
Active RecordにおけるCoC(Convention over Configuration)
- ORMを採用したアプリケーションでは実装にあたって設定などが煩雑になりがち
⇒ Railsは仕様としてルールが設けられているので、そういった設定が最小限で済ませられる(これがいわゆるRailsの"レール"の一部)- このルール外にあたる設定を適用したければ煩雑な設定が必要となる
命名規則
モデル
- 先述の"ルール"として『モデル、DBには適した命名をする』
- [Rails上のモデル ⇔ DB上のテーブル/スキーマ]の関係をRailsに適切に構築してもらうために重要
モデルの命名規則として【モデルのクラス名は"単数形"にする】
2単語以上の英単語から成る名称はキャメルケースで命名する(英単語の先頭字を大文字にする)
- Rails上でオブジェクトを定義する'Class'としては"単数形"で定義する
一般的にはDB上のテーブル名は"複数形"で扱うので、RailsはDB操作時には内部的に"単数形"を"複数形"に変換してくれる。- 例)「rails)"Book"クラスが対応しているテーブルは"books"テーブルだな」→「DB)Rails側が"books"テーブルを参照しにきたわ」
・モデルのクラス - 単数形、語頭を大文字にする(例:
BookClub
)
・データベースのテーブル - 複数形、語はアンダースコアで区切る(例:book_clubs
)
モデル / クラス テーブル / スキーマ Article articles LineItem line_items Deer deers Mouse mice Person people
RailsはORMシステム設計パターンを採用しているから楽にDB操作ができる
Railsは英単語の複数形化の仕組みが卓越している(らしい)
カラム名
- "主キー":デフォルトで
id
という名前のカラムが追加される(integer型) - "外部キー":
[テーブル名の単数形]_id
という命名にする必要がある- 例)
books
テーブルであれば単数形はbook
なので_id
を追加して ⇒book_id
- 例)
モデル作成
- 先述の命名規則でクラスを作成すればOK
-
ApplicationRecord
という親クラスを継承するクラスとして作成する
-
class Product < ApplicationRecord
end
※肝心の中身を記述していないように見えるが、これで内部的にはこのクラスとDBのテーブルとの連携が可能になっている
(この場合は"Product"クラスと"products"テーブルとの連携)
命名ルールの上書き
- どうしてもRailsの命名ルールに従えない場合は一手間必要となる
- デフォルトの命名ルールをオーバーライドすることで既存のルールから外れた実装が可能
ApplicationRecordは、有用なメソッドが多数定義されているActiveRecord::Baseを継承し
ているので、使うべきテーブル名をActiveRecord::Base.table_name=メソッドで明示的に指定
できます。class Product < ApplicationRecord self.table_name = "my_products" end
CRUD
- DB操作を表す「Create」「Read」「Update」「Delete」のイニシャルを取った言葉
- 「基本的なDB操作がオブジェクト介してできるよ!!」という理解でOK
バリデーション
- DBにデータを追加する際にそのデータが想定外な値では困るので「登録内容を事前に検証して場合によっては弾こう」というのが
バリデーション
-
save
(データの新規登録)、update
(データの更新)に際にバリデーションが作用する
-