はじめに
最近Railsの独学をはじめたので備忘録として記事にしていきます。普段は業務でphpを使っていて、データのやりとりにはSQL文を書いてるんですが、SQLを書かずに簡単にデータ操作ができる「ActiveRecord」について学習したので記事を書いていきたいと思います。アドバイスなどがあればコメントお願いします。
ActiveRecordとは?
結論から言うとActiveRecordとは、「DB操作を行うSQLを使わず、Rubyでデータ操作を可能にする仕組み」です。例えば、Userテーブルからidが1の顧客を取得する場合、SQLでは
「SELECT * FROM users WHERE id = 1」
と長いコードを書かなければいけないんですが、ActiveRecordであれば
「User.find(1)」
と書けばID=1のユーザー情報を簡単に取得することができます。
ActiveRecordを使用するメリット
■短いコードで直感的に書くことができる
上記の例のように、ActiveRecordのメソッドを使えば簡単にDB操作を行うことができ、僕みたいな駆け出しエンジニアや初学者の方の心理的なハードルは下がると思います。まずはActiveRecordを使えばこういうことができるというのを経験的に学んで、そこから深く掘り下げてSQLなどを学んでいくと理解が深まると思うのでおすすめです。
よく使うメソッド
作成系(Create)
■newメソッド
インスタンスの生成を行う。newメソッドは新しいオブジェクトを作成するだけで、データベースへの保存はできない。
# インスタンスの生成
user = User.new
user.name = "yamada"
user.email = "example@mail.co.jp"
■saveメソッド
上記のnewメソッドでインスタンスを作成し、代入した値をデータベースに保存するのがsaveメソッド。
保存に成功すればtrue、失敗すればfalseを返す。
# 作成したオブジェクトの保存
user.save
■createメソッド
インスタンスの生成とデータベースの保存を行うメソッド。newメソッドとsaveメソッドが行なっている処理を一括で行う。Userモデルにnameとemail属性があればデータベースに新しいレコードを作成する。
# インスタンスの生成 + オブジェクトの保存
user = User.create(name: "yamada", email: "example@mail.co.jp")
取得系(Read)
■allメソッド
指定したモデルの全てのオブジェクトを取得する。
# ユーザーモデルの全てのレコードを取得
users = User.all
■findメソッド
指定したidから一件のレコードを取得する。
# ユーザーモデルからidが1のレコードを取得
user = User.find(1)
■find_byメソッド
指定した属性、値の最初のレコードを一件取得する。
# ユーザーモデルからname属性が山田のレコードの最初の一件を取得
user = User.find_by(name: "yamada")
■firstメソッド
指定したモデルの最初のレコードを一件取得する。
# ユーザーモデルの最初のレコードを取得
user = User.first
■whereメソッド
指定した属性、値に一致するレコードを全て取得する。先ほどのfind_byメソッドは一致するレコードを一件取得するが、whereメソッドは全て取得する。
# ユーザーモデルのname属性で値が山田のレコードを全て取得
users = User.where(name: "yamada")
更新系(Update)
■updateメソッド
指定したレコードの値を変更する。
# idが1のレコードのname属性を田中に変更する
user = User.find(1)
user.update(name: "tanaka")
下記のコードと上記のコードは同じ意味。
user = User.find(1)
user.name = 'tanaka'
user.save
■update_all
指定した属性のレコードを全て更新する。一回のSQLで全て更新できるので一括で値を更新する場合に便利。
# ユーザーモデルの性別属性を全て男に更新
user.update_all(sex: "male")
削除系(Delete)
■destroyメソッド
指定したレコードを削除する。
# idが1のレコードを削除
user = User.find(1)
user.destroy
■destroy_byメソッド
指定した属性、値と一致するレコードを全て削除する。
# name属性の値が山田のレコードを全て削除
User.destroy_by(name: "yamada")
■destroy_all
指定したモデルの全てのレコードを削除する。
# ユーザーモデルのレコードを全て削除
User.destroy_all