Active Recordは、Ruby on RailsにおけるORM(オブジェクトリレーショナルマッピング)ライブラリで、データベースのレコードをオブジェクトとして扱えるようにします。SQLを直接書かずに、Rubyのメソッドでデータ操作が可能になります。
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
Active Recordでは、new
とcreate
メソッドでレコードを作成できます。
# 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")
データの取得には、find
やwhere
を使用します。
# IDを指定して取得
user = User.find(1)
# 条件で取得
user = User.find_by(email: "alice@example.com")
users = User.where(name: "Alice")
レコードの更新にはupdate
メソッドを使います。
user = User.find(1)
user.update(name: "Updated Name")
レコードを削除するには、destroy
またはdelete
を使用します。
user = User.find(1)
user.destroy # 関連データも削除(通常はこちらを推奨)
User.delete(1) # 単純に削除(コールバックが実行されない)
データの整合性を確保するため、モデルにバリデーションを設定します。
class User < ApplicationRecord
validates :name, presence: true
validates :email, presence: true, uniqueness: true, format: { with: URI::MailTo::EMAIL_REGEXP }
end
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
よく使うクエリをモデルにスコープとして定義すると、コードの可読性と再利用性が向上します。
class User < ApplicationRecord
scope :active, -> { where(active: true) }
end
# 使用例
active_users = User.active
検索を高速化するため、email
のような検索頻度が高いカラムにはインデックスを追加します。
class AddIndexToUsersEmail < ActiveRecord::Migration[6.1]
def change
add_index :users, :email, unique: true
end
end
find_each
を使って大量データを処理する大量のレコードを処理する際には、find_each
を使用してメモリ消費を抑えます。
User.find_each(batch_size: 100) do |user|
puts user.name
end
Active Recordを活用すれば、シンプルなコードでデータベース操作を行えます。しかし、適切なバリデーションの設定や、N+1問題の回避、スコープの活用などのベストプラクティスを守ることで、より効率的で保守性の高いRailsアプリケーションを構築できます。