ActiveRecord は、Ruby on Rails フレームワークで使用されるオブジェクトリレーショナルマッピング(ORM)ツールです。ORMは、データベースのテーブルとオブジェクト指向プログラミング言語のオブジェクトをマッピングし、データベースとオブジェクト指向プログラミング言語の世界をつなぐためのものです。
ActiveRecord は、このORMのひとつで、Ruby on Rails フレームワークの中心的な機能のひとつとして位置づけられています。ActiveRecord には、以下のような主要な機能があります。
モデルの定義
ActiveRecord を使用すると、データベースのテーブルに対応するモデルを簡単に定義できます。モデルは、ActiveRecord::Baseを継承することで定義します。モデルを定義することで、データベースのテーブルと対応するオブジェクトを操作することができます。
class User < ActiveRecord::Base
end
ActiveRecord を使った データの操作
ActiveRecordを使用すると、データのCRUD操作を簡単に実行できます。これにより、データベースのテーブルに対するデータの追加、読み取り、更新、削除が可能になります。
例えば、Userモデルに対してデータの作成、読み取り、更新、削除を行う場合は、以下のように記述します。
# データの作成
user = User.new(name: "John", age: 30)
user.save
# データの読み取り
user = User.find(1)
# データの更新
user.age = 31
user.save
# データの削除
user.destroy
バリデーション
ActiveRecordを使用すると、モデルの属性に対してバリデーションルールを定義できます。これにより、不正なデータの保存を防止できます。
例えば、Userモデルに対して、name属性には必ず値が必要であること、age属性には0以上の数値が必要であることをバリデーションルールとして定義する場合は、以下のように記述します。
class User < ActiveRecord::Base
validates :name, presence: true
validates :age, numericality: { greater_than_or_equal_to: 0 }
end
バリデーションのオプション
ActiveRecordのバリデーションでは、属性に対して様々なルールを定義することができます。これらのルールは、バリデーションのオプションを使用して指定します。
以下では、主要なバリデーションのオプションについて詳しく説明します。
presence: true
presence
オプションを使用すると、属性に値があることを要求することができます。例えば、以下のように記述することで、Userモデルのname属性に値が必要であることをバリデーションルールとして定義できます。
class User < ActiveRecord::Base
validates :name, presence: true
end
numericality: true
numericality
オプションを使用すると、属性が数値であることを要求することができます。例えば、以下のように記述することで、Userモデルのage属性が数値であることをバリデーションルールとして定義できます。
class User < ActiveRecord::Base
validates :age, numericality: true
end
length: { minimum: n, maximum: n }
length
オプションを使用すると、属性が指定した範囲内にあることを要求することができます。例えば、以下のように記述することで、Userモデルのname属性が2文字以上50文字以下であることをバリデーションルールとして定義できます。
class User < ActiveRecord::Base
validates :name, length: { minimum: 2, maximum: 50 }
end
inclusion: { in: ['value1', 'value2', ...] }
inclusion
オプションを使用すると、属性が指定した値の中にあることを要求することができます。例えば、以下のように記述することで、Userモデルのgender属性が'male'または'female'であることをバリデーションルールとして定義できます。
class User < ActiveRecord::Base
validates :gender, inclusion: { in: ['male', 'female'] }
end
exclusion: { in: ['value1', 'value2', ...] }
exclusion
オプションを使用すると、属性が指定した値の中にないことを要求することができます。例えば、以下のように記述することで、Userモデルのrole属性が'admin'または'superuser'ではないことをバリデーションルールとして定義できます。
class User < ActiveRecord::Base
validates :role, exclusion: { in: ['admin', 'superuser'] }
end
これらのバリデーションのオプションを組み合わせることで、より細かなバリデーションルールを定義することができます。
ActiveRecord における 関連付け
ActiveRecordを使用すると、異なるテーブル間の関連付けを簡単に定義できます。これにより、複数のテーブルを結合してデータを取得することができます。例えば、UserモデルとPostモデルを関連付ける場合は、以下のように記述します。
class User < ActiveRecord::Base
has_many :posts
end
class Post < ActiveRecord::Base
belongs_to :user
end
# 関連するデータの取得
user = User.find(1)
user.posts
関連付けのオプション
ActiveRecordでは、異なるテーブル間の関連付けの際に、以下のようなオプションを使用することができます。
:class_name
:class_name
オプションを使用すると、関連するモデルのクラス名を指定することができます。これにより、関連するモデルと同じ名前のクラスを使用しない場合に使用することができます。
例えば、Userが複数のPostを持つ場合、Userモデル内のhas_many :posts
を以下のように書き換えることで、Postモデルのクラス名を明示的に指定することができます。
class User < ActiveRecord::Base
has_many :articles, class_name: 'Post'
end
class Post < ActiveRecord::Base
belongs_to :user
end
:foreign_key
:foreign_key
オプションを使用すると、関連付けのために使用する外部キーのカラム名を指定することができます。これにより、外部キーのカラム名が異なる場合に使用することができます。
例えば、Userが複数のArticleを持つ場合、Articleモデル内のbelongs_to :user
を以下のように書き換えることで、外部キーのカラム名を明示的に指定することができます。
class User < ActiveRecord::Base
has_many :articles, foreign_key: 'author_id'
end
class Article < ActiveRecord::Base
belongs_to :user, foreign_key: 'author_id'
end
:dependent
:dependent
オプションを使用すると、関連するオブジェクトの削除方法を指定することができます。:destroy
を指定すると、関連するオブジェクトが削除された際に、それに関連付けられているオブジェクトも削除されます。
例えば、Userが削除された場合、Userが持つArticleも削除したい場合は、Userモデル内のhas_many :articles
を以下のように書き換えることができます。
class User < ActiveRecord::Base
has_many :articles, dependent: :destroy
end
:through
:through
オプションを使用すると、関連付けを通じて別の関連付けを定義することができます。これにより、間に別のモデルを挟むことで、より複雑な関連付けを定義することができます。
例えば、Userが複数のArticleを持ち、Articleには複数のCommentがある場合、Userが持つCommentを取得するためには、Userモデル内のhas_many :comments
を以下のように書き換え、中間テーブルとしてCommentを指定することができます。
class User < ActiveRecord::Base
has_many :comments
has_many :articles, through: :comments
end
class Comment < ActiveRecord::Base
belongs_to :user
belongs_to :article
end
class Article < ActiveRecord::Base
has_many :comments
has_many :users, through: :comments
end
以上が、ActiveRecord で使用できる主要な関連付けのオプションの一部です。これらのオプションを使用することで、柔軟かつ効率的な関連付けを定義することができます。
ActiveRecord はこれらの機能を活用することで、簡単かつ効率的なデータベースの操作が可能になります。