始めに
現在プログラミング初学者でポートフォリオ作成中です。Modelの理解が曖昧なため自分の様な初心者にもわかりやすいようにまとめてみた。
まずは頑張って公式資料を見てみる
初学者にとって、本当に公式資料は読みにくい。流し読みではまず内容が理解することはできないだろうし、よく読んだとしても独特な言い回しと、見慣れない言葉で説明を受け頭の中はショート寸前となる。そのため、単語ひとつずつ丁寧に噛み砕いていこうと思う(私のために)。
モデルの説明の前に、、、
Active Record
とは、、、
Active Record
とは
Active Record
は 簡単 にデータベースとのやり取りを実現するための道具のこと。
私たちがよく作るモデルに実は組み込まれている。
例えばPost
モデル (モデルクラス
)
class Post < ApplicationRecord
end
よくみると
Post
はApplicationRecord
が持っている 機能 を引き継いでいる。
そして、さらにApplicationRecord
はActiveRecord::Base
が持っている 機能 を引き継いでいる。
つまり
実は私たちがモデルを作成するということは、ActiveRecord
の機能を引き継がせ好きな名前を付けているということらしい。
なのでコントローラーにアクションのプログラムを記述する時に使うこれがActiveRecord
だった。
class PostsController < ApplicationController
def index
@posts = Post.all(ActiveRecordメソッドでpostsテーブル)
#(postsテーブルとのやり取りしたいのでPostモデルを指定).
#(ActiveRecordメソッドでpostsテーブルのレコード全部持ってこい)
end
end
では早速公式資料を読んでみる。
まずは、、、
英単語を翻訳してイメージを掴んでから読み込んでいく。なんなら難しい日本語も辞書を引いてみる
単語 | 意味 |
---|---|
Active | 活動的な、活発な、敏活な、積極的な、意欲的な、活気のある、盛んな |
Record | (…を)記録する、書き留める、登録する、(…と)記録する、記録する、 |
Model | 模型、モデル、ひな形、(原型の)塑像、原形、(理解などの)模型 |
相当 | その程度・地位などに応じていること。あてはまること。 |
business | 事務、業務、仕事、執務 |
logic | 論理、論法、道理、もっともな考え方、「筋」 |
恒久的 | ずっと長く変わらないさま。 |
object | (知覚できる)物、物体、対象 |
relational | 関係のある、相関的な |
mapping | 地図の作成、ある項目に対して、別の項目を位置づけたり、割り当てたりするルール、規則のこと |
Active Recordについて
Active Recordとは、MVCで言うところのM、つまりモデルに相当するものであり、ビジネスデータとビジネスロジックを表すシステムの階層です。Active Recordは、データベースに恒久的に保存される必要のあるビジネスオブジェクトの作成と利用を円滑に行なえるようにします。Active Recordは、ORM(オブジェクト/リレーショナルマッピング)システムに記述されている「Active Recordパターン」を実装したものであり、このパターンと同じ名前が付けられています。
Active Record
とはプログラムの中で扱うデータ
、そのデータ
を処理方法などを表す部分。データベースに予期しない変更などが起こらないように大切に保管される必要のある実物(user
とかpost
テーブルの横一列部分のこと)の作成と利用をスムーズに行える様にします。ORM
(他のテーブル同士の関連してる複雑なデータ構造をオブジェクト指向
のプログラミング言語
でも扱えるようにする手法のこと)に記述されている「Active Record
パターン」を実装したもので、同じ名前が付けられている。
ここまで Active Recordってなんぞや という話です。
長いので
1 Active Recordについて
1.1 Active Recordパターン
1.2 O/Rマッピング
は飛ばします。
1.3 ORMフレームワークとしてのActive Record
Active Recordにはさまざまな機能が搭載されており、その中でも以下のものが特に重要です。
・モデルおよびモデル内のデータを表現する
・モデル同士の関連付け(アソシエーション)を表現する
・関連付けられているモデル間の継承階層を表現する
・データをデータベースで永続化する前にバリデーション(検証)を行なう
・データベースをオブジェクト指向スタイルで操作する
他のテーブル同士のデータをうまい具合に関連させて利用してくれるActive Record
には様々な機能があり、以下のものが特に重要です。
・データベースとのやり取りを上手く処理してくれるモデルやそのモデルの中のデータを表現する (user.nameとか)
・複雑な関連付けを簡単に表現してくれる(user.likes.postsとか)
・データベースのデータが予期しない変更などないように、保存する前に本当に保存していいか検証する(varidationのこと)
・複雑なデータのやり取りをオブジェクト指向スタイルで操作できる様にする。User.findとか?
2 Active RecordにおけるCoC(Convention over Configuration)
他のプログラミング言語やフレームワークでアプリケーションを作成すると、設定のためのコードを大量に書く必要が生じがちです。一般的なORMアプリケーションでは特にこの傾向があります。しかし、Railsで採用されているルール(規約)に従っていれば、Active Recordモデルの作成時に書かなければならない設定用コードは最小限で済みますし、設定用コードが完全に不要になることすらあります。これは「設定がほとんどの場合で共通ならば、その設定をアプリケーションのデフォルトにすべきである」という考えに基づいています。つまり、ユーザーによる明示的な設定が必要となるのは、標準のルールでは足りない場合だけです。
設定より規約(せっていよりきやく、英: convention over configuration; CoC)
開発者の決定すべきことを減少させ、単純にするが柔軟性は失わせない。
他のプログラミング言語でアプリを作成すると、__設定__のためにコードをたくさん書く必要がある。しかしRailsでは規約に従えば設定するためのコードが最小限で済むし、もし書く必要があるとしても標準ルールでは足りない場合だけ。
命名ルール
Active Recordには、モデルとデータベースのテーブルとのマッピング作成時に従うべきルールがいくつかあります。Railsでは、データベースのテーブル名を探索するときに、モデルのクラス名を複数形にした名前で探索します。つまり、Bookというモデルクラスがある場合、これに対応するデータベースのテーブルは複数形の「books」になります。Railsの複数形化メカニズムは非常に強力で、不規則な語でも複数形/単数形に変換できます(person <-> peopleなど)。モデルのクラス名が2語以上の複合語である場合、Rubyの慣習であるキャメルケース(CamelCaseのように語頭を大文字にしてスペースなしでつなぐ)に従ってください。一方、テーブル名はスネークケース(snake_caseなど、小文字とアンダースコアで構成する)にしなければなりません。以下の例を参照ください。
Active Record
にはモデル(大元がActiveRecord::Base
)とデータベースのテーブル
との位置付けや割り当てを作成する時に従うべきルールがある。テーブル名を命名する時はモデル名の複数形にする
2022/07/31 執筆中