一般社団法人 全国個人事業主支援協会

COLUMN コラム

  • Active Recordの使い方とベストプラクティス

1. Active Recordとは?

Active Recordは、Ruby on RailsにおけるORM(オブジェクトリレーショナルマッピング)ライブラリで、データベースのレコードをオブジェクトとして扱えるようにします。SQLを直接書かずに、Rubyのメソッドでデータ操作が可能になります。

2. 基本的な使い方

モデルの作成

Railsでは、rails generate model コマンドでモデルを作成します。

rails generate model User name:string email:string

作成後、db/migrate/ 内のマイグレーションファイルを編集し、以下のようにデータベースを変更できます。

class CreateUsers < ActiveRecord::Migration[6.1]
  def change
    create_table :users do |t|
      t.string :name, null: false
      t.string :email, null: false, unique: true
      t.timestamps
    end
  end
end

マイグレーションを適用するには、以下のコマンドを実行します。

rails db:migrate

レコードの作成(INSERT)

Active Recordでは、newcreateメソッドでレコードを作成できます。

# new + save
user = User.new(name: "Alice", email: "alice@example.com")
user.save

# create(new + saveを一度に実行)
user = User.create(name: "Bob", email: "bob@example.com")

レコードの取得(SELECT)

データの取得には、findwhereを使用します。

# IDを指定して取得
user = User.find(1)

# 条件で取得
user = User.find_by(email: "alice@example.com")
users = User.where(name: "Alice")

レコードの更新(UPDATE)

レコードの更新にはupdateメソッドを使います。

user = User.find(1)
user.update(name: "Updated Name")

レコードの削除(DELETE)

レコードを削除するには、destroyまたはdeleteを使用します。

user = User.find(1)
user.destroy  # 関連データも削除(通常はこちらを推奨)

User.delete(1)  # 単純に削除(コールバックが実行されない)

3. Active Recordのベストプラクティス

1. バリデーションを適切に設定する

データの整合性を確保するため、モデルにバリデーションを設定します。

class User < ApplicationRecord
  validates :name, presence: true
  validates :email, presence: true, uniqueness: true, format: { with: URI::MailTo::EMAIL_REGEXP }
end

2. N+1問題を避ける(includesを活用)

関連データを取得する際、includesを使用してN+1問題を回避します。

# N+1問題が発生する可能性があるコード
users = User.all
users.each do |user|
  puts user.posts.count
end

# includesで解決
users = User.includes(:posts)
users.each do |user|
  puts user.posts.count
end

3. スコープを活用する

よく使うクエリをモデルにスコープとして定義すると、コードの可読性と再利用性が向上します。

class User < ApplicationRecord
  scope :active, -> { where(active: true) }
end

# 使用例
active_users = User.active

4. データベースインデックスを適切に設定する

検索を高速化するため、emailのような検索頻度が高いカラムにはインデックスを追加します。

class AddIndexToUsersEmail < ActiveRecord::Migration[6.1]
  def change
    add_index :users, :email, unique: true
  end
end

5. find_each を使って大量データを処理する

大量のレコードを処理する際には、find_eachを使用してメモリ消費を抑えます。

User.find_each(batch_size: 100) do |user|
  puts user.name
end

4. まとめ

Active Recordを活用すれば、シンプルなコードでデータベース操作を行えます。しかし、適切なバリデーションの設定や、N+1問題の回避、スコープの活用などのベストプラクティスを守ることで、より効率的で保守性の高いRailsアプリケーションを構築できます。

The following two tabs change content below.

金 玹昊

この記事をシェアする

  • Twitterでシェア
  • Facebookでシェア
  • LINEでシェア