【完全版】RubyonRailsのActiveRecord基礎!
こんにちは。opiyoです。
今日はRailsの勉強をしていると出てくる「Active Record 」について、勉強したいと思います。
こんな奴らですね。
ではでは早速、行ってみましょう。
railsでデータを取得するActiveRecordとは
Ruby on Railsで使われているO/Rマッパー。データベースからデータを取り出すときのアプローチの一つ。
O/Rマッパーとは
- 「オブジェクトリレーショナルマッピング」の略。 (ORMと略されることもある)
- オブジェクトをリレーショナルデータベース(RDBMS)のテーブルに接続するもの
- ORMを使用することで、SQL文を直接書かなくて良い
- わずかなコードで、オブジェクトの属性やリレーションシップをデータベースに保存/読み出しができる
ActiveRecordの命名ルール
- モデル/クラス名:単数形、テーブル名:複数形
- モデル/クラス: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ガイドになります。 今後も学んだことは追記し、充実させていければと思っております。