ActiveRecordとは?何者?
ActiveRecordはRuby on Railsフレームワークにおけるオブジェクト・リレーショナル・マッピング(ORM)のライブラリです。
つまり、データベースに保存されたデータをRubyのオブジェクトにマッピングし、操作を行うためのライブラリです。
ActiveRecordは、データベースに保存されたデータをRubyのクラスのインスタンスとして扱うことができるようにするための、ActiveRecordパターンと呼ばれるアーキテクチャを採用しています。
ActiveRecordパターンでは、各データベーステーブルは対応するRubyクラスに対応し、各テーブルに格納されているデータは、それぞれのクラスのインスタンスに対応します。
ActiveRecordでは、データベースの操作を行うためのメソッドが提供されており、Rubyのオブジェクトとしてデータベースに保存されているデータを操作することができます。
- find: レコードを検索して取得
- where: 条件を指定してレコードを取得
- create: レコードを新規作成
- update: レコードを更新
- destroy: レコードを削除
- save: レコードを保存
ActiveRecordは、データベースにアクセスする際のSQLの生成を自動的に行うため、開発者にとってSQLを扱うことなく、データベースの操作を行うことができるようになります。
また、ActiveRecordはActiveRecordのモデルに対して、バリデーションやコールバック、アソシエーションなどのフレームワーク機能を提供し、開発者がアプリケーションを開発する際に便利な機能を提供します。
ActiveRecordは、Ruby on Railsには標準搭載されており、Railsアプリケーション開発において、データベースアクセスのための基本的なメソッドを有しています。
以下でActiveRecordのメソッドについて深掘りしていきましょう。
ActiveRecordにはどんな種類のメソッドが存在するのか?
ActiveRecordはRailsのORMであり、データベースとRailsのモデルクラスを紐付ける役割を担います。
そのため、ActiveRecordには主に以下のような種類のメソッドが存在します。
1 | CRUD(Create, Read, Update, Delete)関連のメソッド | データベースに対して、新規作成、取得、更新、削除の操作を行うためのメソッドです。 |
2 | クエリ関連のメソッド | データベースから特定の条件でデータを取得するためのメソッドです。 例えば、 where 、order 、limit など。 |
3 | バリデーション関連のメソッド | エンティティの妥当性をチェックするためのメソッドです。 例えば、 valid? 、errors など。 |
4 | エンティティ関連のメソッド | エンティティの操作や管理に関するメソッドです。 例えば、 attributes 、attribute_names 、 |
5 | コールバック関連のメソッド | エンティティのライフサイクルイベントに対して、特定の処理を行うためのメソッドです。 例えば、 before_save 、after_create など。 |
6 | アソシエーション関連のメソッド | エンティティ間の関連を管理するためのメソッドです。 例えば、 has_many 、belongs_to など。 |
7 | マイグレーション関連のメソッド | データベーススキーマの変更を管理するためのメソッドです。 例えば、 create_table 、add_column など。 |
上から順に種類ごとにActiveRecordのメソッドを紹介しますね。
ActiveRecordのCRUD(Create, Read, Update, Delete)関連のメソッド
ActiveRecordのCRUD(Create, Read, Update, Delete)関連のメソッドには、以下のメソッドが含まれます。
create
: 新しいレコードを作成します。create!
: 新しいレコードを作成し、保存時に失敗した場合は例外を発生させますnew
: 新しいレコードを作成するためのオブジェクトを返します。find
: 主キーで指定されたレコードを取得します。find_by
: 条件に合った最初のレコードを取得します。find_by!
: 条件に合った最初のレコードを取得し、存在しなかった場合は例外を発生させますfirst
: テーブル内の最初のレコードを取得します。last
: テーブル内の最後のレコードを取得します。all
: テーブル内の全レコードを取得します。where
: 条件に合ったレコードを取得します。order
: レコードをソートします。limit
: 取得するレコード数を制限します。offset
: 取得するレコードのオフセットを指定します。update
: 既存のレコードを更新します。update_all
: 条件に合った全レコードを更新します。destroy
: レコードを削除します。destroy_all
: 条件に合った全レコードを削除します。save
: レコードを保存します。save!
: レコードを保存し、失敗した場合は例外を発生させます
ActiveRecordのクエリ関連のメソッド
ActiveRecordのクエリ関連のメソッドには、以下のようなものがあります。
select
: 指定したカラムのみを取得group
: グループ化条件を指定しますhaving
: GROUP BY の結果に対して条件を指定しますjoins
: JOIN 文を指定しますleft_outer_joins
: LEFT OUTER JOINを指定where
: 条件を指定し、取得しますor
: or条件を指定not
: NOT条件を指定and
: AND条件を指定distinct
: DISTINCT句を指定order
: ORDER句を指定reverse_order
: ORDER句を逆順に指定limit
: LIMIT句を指定offset
: OFFSET句を指定lock
: ロック条件を指定readonly
: 取得結果を読み取り専用にするfrom
: FROM句を指定pluck
: 指定したカラムの値のみを取得unscope
: スコープから条件を除外find_or_create_by
: 指定条件のレコードを検索し、見つからなかった場合には新しく作成find_or_initialize_by
: 指定条件のレコードを検索し、見つからなかった場合には新しいインスタンスを返す
ActiveRecordのバリデーション関連のメソッド
ActiveRecordのバリデーション関連のメソッドには、以下のようなものがあります。
valid?
: レコードが妥当かどうかをチェックします。invalid?
: レコードが不妥当かどうかをチェックします。validate
: レコードをバリデーションします。validate!
: レコードをバリデーションし、失敗した場合は例外を発生させます。errors
: レコードのエラーメッセージを格納したオブジェクトを返します。errors.full_messages
: レコードのエラーメッセージを文字列の配列で返します。errors.add
: エラーメッセージを追加しますerrors.clear
: エラーメッセージをクリアしますerrors.delete
: 指定した属性のエラーメッセージを削除しますerrors.empty?
: エラーメッセージが空かどうかを返します
これらは、各アトリビュートに対して、必須項目かどうか、最大長、最小長、正規表現などの条件を設定できます。
ActiveRecordのエンティティ関連のメソッド
ActiveRecordのエンティティ関連のメソッドには、以下のようなものがあります。
attributes
: エンティティのアトリビュートのハッシュを返します。attribute_names
: エンティティのアトリビュート名の配列を返します。attribute_present?
: 指定したアトリビュートが存在しているかどうかを返します。assign_attributes
: 複数のアトリビュートを一度に割り当てます。read_attribute
: 指定したアトリビュートの値を返します。write_attribute
: 指定したアトリビュートに値を設定します。update
: エンティティをデータベースに保存します。update_attribute
: エンティティの指定したアトリビュートを更新します。update_attributes
: エンティティの複数のアトリビュートを更新します。update_attributes!
: エンティティの複数のアトリビュートを更新し、保存時に失敗した場合は例外を発生させますincrement!
: エンティティのアトリビュートをインクリメントします。decrement!
: エンティティのアトリビュートをデクリメントします。toggle!
: エンティティのアトリビュートのブール値を反転しますreload
: エンティティをデータベースから再取得します。touch
: エンティティのupdated_atアトリビュートを現在時刻に更新します
ActiveRecordのコールバック関連のメソッド
ActiveRecordのコールバック関連のメソッドには、以下のようなものがあります。
before_validation
: バリデーションの前に呼び出されますafter_validation
: バリデーションの後に呼び出されますbefore_validation_on_create
: create時のバリデーションの前に呼び出されますafter_validation_on_create
: create時のバリデーションの後に呼び出されますbefore_validation_on_update
: update時のバリデーションの前に呼び出されますafter_validation_on_update
: update時のバリデーションの後に呼び出されますbefore_save
: 保存前に呼び出されますaround_save
: 保存前後に呼び出されますbefore_create
: create時に呼び出されますaround_create
: create時の前後に呼び出されますafter_create
: create後に呼び出されますbefore_update
: update時に呼び出されますaround_update
: update時の前後に呼び出されますafter_update
: update後に呼び出されますbefore_destroy
: destroy時に呼び出されますaround_destroy
: destroy時の前後に呼び出されますafter_destroy
: destroy後に呼び出されますafter_commit
: コミット後に呼び出されますafter_rollback
: ロールバック後に呼び出されます
これらのコールバックメソッドは、ActiveRecord::Base クラスの中で定義されており、モデルクラスで使用する際は、それぞれのメソッドをオーバーライドすることで、自分自身が定義した処理を行うことができます。
ActiveRecordのアソシエーション関連のメソッド
ActiveRecordのアソシエーション関連のメソッドには、以下のようなものがあります。
belongs_to
: 1対1の関連を定義しますhas_one
: 1対1の関連を定義しますhas_many
: 1対多の関連を定義しますhas_many :through
: 関連テーブルを介した1対多の関連を定義しますhas_one :through
: 関連テーブルを介した1対1の関連を定義しますhas_and_belongs_to_many
: 多対多の関連を定義しますaccepts_nested_attributes_for
: ネストした属性を受け入れるアソシエーションを指定しますdependent
: 関連付けられたオブジェクトの破棄方法を指定しますcounter_cache
: カウンターキャッシュを使用するためのオプションを指定しますprimary_key
: 主キーを指定しますinverse_of
: 反対側の関連を指定しますautosave
: 自動保存を有効にします
これらのメソッドは、ActiveRecordのModelクラスによって使用可能であり、モデルクラスに対して使用することで、関連付けられたオブジェクトとのやり取りを簡単にすることができます。
ActiveRecordのマイグレーション関連のメソッド
ActiveRecordのマイグレーション関連のメソッドには、以下のようなものがあります。
create_table
: テーブルを作成しますdrop_table
: テーブルを削除しますchange
: テーブルのスキーマを変更しますrename_table
: テーブル名を変更しますadd_column
: カラムを追加しますremove_column
: カラムを削除しますrename_column
: カラム名を変更しますchange_column
: カラムの設定を変更しますadd_index
: インデックスを追加しますremove_index
: インデックスを削除しますexecute
: SQLを実行します
これらのメソッドは、ActiveRecord::Migrationクラスによって使用可能であり、マイグレーションスクリプト内で使用することで、データベーススキーマを変更することができます。
また、Railsにはrakeタスクとして、マイグレーションの作成、実行、ロールバックなどを行うことができる機能があります。