【Ruby on Rails】Active Record(アクティブレコード)とは何なのか？ORMとの違い

個人用メモです。

Ruby on RailsのActive Record(アクティブレコード)とは何なのかについてのまとめ。[公式リンク](https://railsguides.jp/active_record_basics.html#read)


#目次

1. [Active Recordとは？](#active-recordとは)
2. [ORMとは？](#ormとは)
3. [Active Recordでできること](#active-recordでできること)
4. [命名ルール](#命名ルール)
5. [DB構造のルール（スキーマ）](#db構造のルールスキーマ)
6. [Active Record(モデル)の生成](#active-recordモデルの生成)
7. [テーブル名の変更方法](#テーブル名の変更方法)
8. [主キーの変更方法](#主キーの変更方法)
9. [バリデーションの作成](#バリデーションの作成)
10. [マイグレーション](#マイグレーション)



<br>
##Active Recordとは？
RailsでMVCモデルのM（モデル）に該当する機能のこと。
なので、**Active Record = Model** の認識でOK。

Modelは概念なので、Railsにおいて、Modelの概念を担う機能がActive Recordとなる。


##ORMとは？
Object/Relational Mappingの略。（O/Rマッピングとも呼ばれる）

DBをSQL文で直接操作するのではなく、Modelを介して操作する、この技術をORMと呼ぶ。

ORMの技術を使うことで、DBとModelが接続できる。このDBとの接続処理をRailsではActive Recordと呼ぶ。


<br>
###Active Recordでできること

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


<br>
##Active Recordのルール
ModelとDBを関連づけるために、モデル名とテーブル名にルールが存在する。

###命名ルール
RailsではDBのテーブル名を探索するときに、モデルのクラス名を複数形にした名前で探索する。

このため、モデル名は常に、頭文字大文字、単数形、キャメルケースで作成する必要がある。

| モデル / クラス | テーブル / スキーマ |
|:-:|:-:|
| Article  | articles  |
| LineItem  | line_items  |
| Person  | people  |

単数形のモデル名から、該当するテーブル名を検出するのはRailsが自動でやってくれる。

このルールに則り、コントローラを生成するコマンドを実行すると、そのコントローラ名に合わせて、モデルとテーブルも自動生成してくれる。


<br>
##DB構造のルール（スキーマ）
Railsでテーブルを生成するときは一定のルール（スキーマ）に則る。

1. デフォルトの主キーは`カラム名id（型:integer）`
2. 外部キーは`テーブル名の単数形_id`（itemsテーブルなら、item_id）
3. 自動生成されるカラム
    4. created_at: 作成時のタイムスタンプ
    5. updated_at: 更新時のタイムスタンプ



<br>
##Active Record(モデル)の生成
ApplicationRecordクラスのサブクラスを作成するだけ。

```rb:model名.rb
class モデル名 < ApplicationRecord
end
```

命名ルールに従って、複数形のテーブル名にマッピングする。

Railsコマンドを使うともっと簡単。必要なファイルも一挙に生成してくれる。

```
$ bin/rails generate controller <コントローラ名> <アクション名>
```

**▼実例**

```
$ bin/rails generate controller Articles index --skip-routes

Running via Spring preloader in process 31185
      create  app/controllers/articles_controller.rb
      invoke  erb
      create    app/views/articles
      create    app/views/articles/index.html.erb
      invoke  test_unit
      create    test/controllers/articles_controller_test.rb
      invoke  helper
      create    app/helpers/articles_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    scss
      create      app/assets/stylesheets/articles.scss
```



###ApplicationRecord
ApplicationRecordは有用なメソッドが多数定義されているActiveRecord::Baseを継承している。


<br>
##テーブル名の変更方法
デフォルトではDBに生成されるテーブルは命名ルールに則るが、これを変更することも可能。

モデルファイルの中に既述すればOK。

```rb:model名.rb
class モデル名 < ApplicationRecord
  self.table_name = "変更後のテーブル名"
end
```


<br>
##主キーの変更方法
テーブル名と同様に主キーもモデルファイルで変更することができる。

```rb:model名.rb
class モデル名 < ApplicationRecord
  self.primary_key = "変更後の主キー名"
end
```

>idという名前が使えるのは主キーのみ。他のカラムではサポートされていない。



<br>
##バリデーションの作成
モデルファイルには、変更する命名ルールの他に、バリデーションも記述できる。

``````rb:model名.rb
class モデル名 < ApplicationRecord
  validates: :カラム名, バリデーションルール
end
```

バリデーションルールには、必須にする`presence: true`やemailの形式を指定する`email`, 確認用の`confirmation`や最大文字数・最小文字数を指定など多くのルールが用意されている。


<br>

```rb:バリデーションの例
class Person < ApplicationRecord
  validates :name, presence: truem, length: { minimum: 2 }
  validates :email, uniqueness: true, on: :account_setup
  validates :age, numericality: true, on: :account_setup
end
```

[rails公式　バリデーションルール](https://railsguides.jp/active_record_validations.html)



<br>
##マイグレーション
ModelとDBは常時連携しておらず、変更内容を反映するためにはマイグレーションをする必要がある。

・`bin/rails db:migrate`

一つ戻したいとき（ロールバック）は、`bin/rails db:rollback`　を行う。


###マイグレーションファイルの例
generateコマンドでコントローラを生成すれば、マイグレーションファイルも自動生成される。

db/migrate/20210309094422_create_articles.rb

```rb:20210309094422_create_articles.rb
class CreateArticles < ActiveRecord::Migration[6.1]
  def change
    create_table :articles do |t|
      t.string :title
      t.text :body

      t.timestamps
    end
  end
end
```


<br>
以上。

Active Recordという名称がでてきたら、Railsのモデルのことと覚えておけばOK。

ORMはモデルでDBを操作する技術のこと。モデルは間接的にDBを操作するもの。