LoginSignup
0
1

More than 1 year has passed since last update.

Active Record

Last updated at Posted at 2023-03-27

Active Recordの役割

Active Recordとは、モデルの重要な役割を担うRailsコンポーネントの一つ。具体的には、データベースのテーブルとモデルの関係付けを行う役割を担っている。一般的にそのような役割を果たす仕組みをORM(Object-Relational Mapping)と呼ぶ。

基本的にデータベース操作ではSQLを使用する。データベースの種類の違いを引き受け、ORMが共通語のような形でメソッドを利用できるようにしている。

モデルの作成手順

  • 対象となるモデルの作成
$ rails g model User name:string email:string

  • マイグレーションを実行し、モデルに対応するテーブルを作成

マイグレーションとは、マイグレーションファイルを使ってRails側から別の世界にあるデータベースを作成・更新するための作業。モデル生成時に作成されたファイル情報をもとにマイグレーションを行う。

$ rails db:migrate

マイグレーションを実行することで、最新のデータベーステーブル構造などの情報を反映したスキーマが作成される。

  • シード機能の利用
    シードを利用することで、あらかじめテーブルに入れておきたい固有情報を登録することができる。
    seeds.rbファイルに記述すれば、データを登録することができる。

CRUD操作

Create:新規作成
$ User.createname: "田中", email: "sample@aaa.com"

モデルクラスのメソッドを直接呼び出して利用可能な、newとsaveを一連で行うメソッド。createメソッドでは、バリデージョンにエラーが発生しても、falseとして評価することができないため、基本的はsaveを利用する。

$ @user1 = User.newname: "田中", email: "sample@aaa.com"
$ @user1.save
Read:読み出し
  • find(id値)
$ User.findid

指定されたidを持つデータを取得し、対応するモデルのインスタンスを生成する。

  • find_by(条件)
$ User.find_byname:"山田"

指定された条件に一致するデータを取得し、対応するモデルのインスタンスを生成する。

Update:更新
  • update
    モデルのクラスに対して更新するクラスメソッド
$ User.updateid, {name:"鈴木"}

モデルのインスタンスに対して更新するインスタンスメソッド

$ user1 = User.find(id)
$ user1.updatename:"山田"
Delete:削除
  • destory
    モデルのクラスに対して更新するクラスメソッド
$ User.destroyid

モデルのインスタンスに対して更新するインスタンスメソッド

$ User.findid.destroy

バリデーション

バリデーションとは、入力されたデータか妥当かどうかを評価し、適正なデータだけをデータベースに取り込むための機能。
実装方法は大きく分けると、標準のヘルパーを利用する方法と、独自のヘルパーを利用する二つの方法がある。
また、独自のヘルパーを作成するには、モデル内でメソッドを設定する方法とValidatorクラスを使用して作成する方法がある。

バリデーションの使用例

Userモデルに次のように書くと

class User < ApplicationRecord
  validates :name, presence:true, length: {maximum: 100}

nameが入力されていない場合はエラーとなり、長さは最大100文字までとなる。

正規表現について

入力された値や文字列が、決められたパターンに該当しているかどうかを評価するとき正規表現を使用する。「/・・・/」のように/で囲むことで正規表現を表す。

/\A\d{3}-\d{4}\z/

郵便番号などはこのように表現される。

アソシエーション

データリソースを管理するデータベースを対して、データの整合性を確保することを正規化といいます。Railsにおいて、正規化を用いてモデル間の関係を定義する仕組みがアソシエーションです。

has_many

自身が他のモデルに対して一対多の関係を持つことを定義する。

# ユーザーモデルから各ユーザーを見た時の関係
class User < ApplicationRecord
  has_many :users
end

has_one

自身が他のモデルに対して一対一の関係を持つことを定義する。

# ユーザーモデルから電話番号を見た時の関係
class User < ApplicationRecord
  has_one :phone_number 
end

belongs_to

他のモデルとの一対多の関係を持つことを定義する。

# 投稿モデルからユーザーを見た時の関係
class Post < ApplicationRecord
  belongs_to :users 
end

外部キーの設定方法

Railsの標準ルールでは、子モデルに属性タイプをreferencesとし、親モデル名を属性にすれば、親モデルIDを子モデルの属性とすることができる。例えば、親モデル「Teacher」、子モデル「Students」があるとき

$ rails g model teacher name:string
$ rails g model students name:string teacher:references

とすれば、「teacher_id」がStudentsモデルの外部キーとなる。

単一テーブル継承(STI)

データベースの1つのテーブルに対応するモデルをもとにして、複数の異なるモデルに継承させる単一テーブル継承(Single Table Inheritance)という関係がある。

ペットを管理するPetモデルと、それを継承するDogモデルとCatモデルを生成する。データベースのテーブルはPetモデルだけに紐づいていて、DogとCat、それぞれのデータはPetsテーブルの中で管理される。

まずPetモデルを次のように生成する。typeカラムを持たせることで、継承されるモデルのクラス名が保存される。

$ railg g model pet type:string name:strig

Petモデルが次のように生成される。

pet.rb
class Pet < ApplicationRecord
end

継承するDogモデルとCatモデルは次のようにエディタで作成する。

dog.rb
class Dog < Pet
end
cat.rb
class Cat < Pet
end

これでDog,Catモデルそれぞれのインスタンスを作成し、利用することができるようになる。

0
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
0
1