おぴよの気まぐれ日記

おぴよの気まぐれ日記

岡山やプログラミング、ファッションのこと、子育てや人生、生き方についての備忘録。

【完全版】Active Record の基礎!

こんにちは。opiyoです。

今日はRailsの勉強をしていると出てくる「Active Record 」について、勉強したいと思います。

  • User.first
  • User.find(1)
  • User.update
  • User.create!(hoge: hoge)

こんな奴らですね。

ではでは早速、行ってみましょう。

Active Recordとは

Ruby on Railsで使われているO/Rマッパー。データベースからデータを取り出すときのアプローチの一つ。

O/Rマッパーとは

  • 「オブジェクトリレーショナルマッピング」の略。 (ORMと略されることもある)
  • オブジェクトをリレーショナルデータベース(RDBMS)のテーブルに接続するもの
  • ORMを使用することで、SQL文を直接書かなくて良い
  • わずかなコードで、オブジェクトの属性やリレーションシップをデータベースに保存/読み出しができる

命名ルール

  • モデル/クラス名:単数形、テーブル名:複数形
  • モデル/クラス:2語以上の場合はキャメルケース(語頭を大文字にしてスペースなしでつなぐ)
  • テーブル:小文字かつアンダースコアで区切る
モデル/クラス名 テーブル/スキーマ
Post posts
LineTime line_time
Person people

スキーマのルール

  • 外部キー:テーブル名の単数形_idにする
  • 主キー:デフォルトはidのカラム

モデルの作成

Userモデルを作成するにはApplicationRecordクラスのサブクラスを作成します。

SQLでテーブルを作成するとこうなります。

CREATE TABLE products (
   id int(11) NOT NULL auto_increment,
   name varchar(255),
   PRIMARY KEY  (id)
);

後から出てくるマイグレーションを使うとコマンドを使ってモデルの作成が可能です。

$ rails g model Procust name:string

CRUD データの読み書き

登録(Create)

  • newメソッドは新しい「オブジェクト」を作成する
  • createメソッドはデータベースに保存される
user = Usre.create(name: "David", email: "kosmo.waizu0804@gmail.com")

newメソッドを使う場合は、オブジェクトは保存されない。saveして保存する。

user = User.new
user.name = "David"
user.email = "kosmo.waizu0804@gmail.com"

user.save

一覧表示(Read)

# すべてのユーザーを返す
User.all
# 最初のユーザーを返す
User.first
# Davidという名前を持つ最初のユーザーを返す
david = User.find_by(name: 'David')
# 名前がDavidで、職業がコードアーティストのユーザーをすべて返し、created_atカラムで逆順ソートする
users = User.where(name: 'David', occupation: 'Code Artist').order('created_at DESC')

更新(update)

# saveメソッドを使う場合
user = User.find_by(name: "David")
user.name = 'Dave'
user.save
# updateメソッドを使う場合
user = User.find_by(name: "David")
user.update(name: 'Dave')
# 複数属性、複数レコード更新する場合
user.update_all "max_login_attempts = 3, must_change_password = 'true'"

削除(delete)

user = User.find_by(name: "David")
user.destroy

検証(validation)

  • ActiveRecordを使用すると、データベースに書き込まれる前に状態を検証することができる
  • 例えば
    • 空でないこと
    • 一意であること
    • すでにデータベースにないこと
  • save、updateメソッドは検証に失敗した場合は「false」を返す
class User < ApplicationRecord
  validates :name, presence: true # presenceは空を許さない
end
 
user = User.new 
user.save  # => false # 空のままsaveしてるので失敗 → false
user.save! # => ActiveRecord::RecordInvalid: Validation failed: Name can't be blank # 空のままsave!してるので失敗 → 例外

コールバック

データを作成、更新、登録、削除する前後に何かしら処理をしたい場合などに利用します。 例えばRailsチュートリアルでは、Userモデルを登録する前(before_save)でメールアドレスを小文字にするメソッドを呼び出す。などをしてます。

マイグレーション

Railsではデータベースの情報を履歴として管理する仕組みがあり、これをマイグレーション(migration)よ呼びます。 どのマイグレーションファイルが、データベースに反映されているかRailsは知っているので一つ前の状態に戻すなどが簡単にできます。

# db/migrate/20170629005430_create_users.rb
class CreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users do |t|
      t.string :name
      t.string :email

      t.timestamps
    end
  end
end
# db/migrate/20170806092710_add_admin_to_users.rb
class AddAdminToUsers < ActiveRecord::Migration[5.0]
  def change
    add_column :users, :admin, :boolean, default: false
  end
end

実行方法はrails db:migrate。一つ前に戻る時はrails db:rollback。一からやり直したい時はrails db:migration:reset

これらをまとめた元ネタはRailsガイドになります。 今後も学んだことは追記し、充実させていければと思っております。