3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

rails モデルとは何か 初心者向け

Last updated at Posted at 2022-07-31

始めに

現在プログラミング初学者でポートフォリオ作成中です。Modelの理解が曖昧なため自分の様な初心者にもわかりやすいようにまとめてみた。

まずは頑張って公式資料を見てみる

初学者にとって、本当に公式資料は読みにくい。流し読みではまず内容が理解することはできないだろうし、よく読んだとしても独特な言い回しと、見慣れない言葉で説明を受け頭の中はショート寸前となる。そのため、単語ひとつずつ丁寧に噛み砕いていこうと思う(私のために)。

Ruby on Rails公式ページ

モデルの説明の前に、、、

Active Recordとは、、、

Active Recordとは
Active Record簡単 にデータベースとのやり取りを実現するための道具のこと。
私たちがよく作るモデルに実は組み込まれている。
例えばPostモデル (モデルクラス)

Postmodel
class Post < ApplicationRecord
end

よくみると

PostApplicationRecordが持っている 機能 を引き継いでいる。
そして、さらにApplicationRecordActiveRecord::Baseが持っている 機能 を引き継いでいる。

つまり

実は私たちがモデルを作成するということは、ActiveRecordの機能を引き継がせ好きな名前を付けているということらしい。
なのでコントローラーにアクションのプログラムを記述する時に使うこれがActiveRecordだった。

posts_controller
class PostsController < ApplicationController

    def index
    @posts = Post.allActiveRecordメソッドで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 執筆中

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?