Active Record
Active Record(アクティブ・レコード)とは、プログラミングにおいて、企業アプリケーションで頻繁に認められるデザインパターンである。
概要
[編集]Active Recordはデータベースからデータを読み出すためのアプローチである。データベーステーブルあるいはビューの1行が1つのクラスにラップされ、オブジェクトのインスタンスがそのデータベースの1つの行に結合される。このクラスはデータベースアクセスのカプセル化も行う[1]。オブジェクトの生成後は、保存メソッドで新しい行がデータベースに追加される。 オブジェクトが更新されると、データベースの対応する行もまた更新される。ラッパークラスはテーブルあるいはビューの各カラムに対するアクセサメソッドを実装するが、それ以外の振る舞い(MVCのモデルが担当すべきロジック)も記述することができる[1]。
テーブルとクラスが一対一で結びつくことから非常にシンプルな構造となることが特徴で、後述するRuby on Railsでは、データベース定義からほぼ自動でCRUD操作を備えたクラスを作り出すことを実現している。一方でその性質上、複雑な設計のデータベースとは相性が悪い。[1]
例
[編集]Ruby on Rails
[編集]広く使われている実装のひとつは、Ruby on Rails のActive Recordの実装である。例えば、id 列(シリアルな主キー)、name 列(varchar 型)、price 列(money 型あるいは double 型)を持った parts テーブルがあれば、次のようなコードになる。
a = Part.new
a.name = "Sample part"
a.price = 123.45
a.save
上記のコードは与えられた値で新しい行をデータベースに作る。これは次の SQL コマンドにほぼ等価である。
INSERT INTO parts (name, price) VALUES ('Sample part', 123.45);
逆に、データベースを検索するためこのクラスを用いることもできる。
widgetname = "gearbox"
b = Part.where(:name => widgetname).first
このコードは、name
列が Ruby 変数 widgetname
の値一致する最初の行を取得して、オブジェクトを生成する。取得については、次の SQL コマンドと同義であるが、前述のrubyコードにそれは現れない。
SELECT * FROM parts WHERE name = 'gearbox' LIMIT 1;
別の方法として、上記のコードは次のように短くすることもできる。
b = Part.find_by_name("gearbox")
脚注
[編集]- ^ a b c “デザインパターンから見たActive Record”. TECHSCORE (2012年5月23日). 2024年4月1日閲覧。
関連項目
[編集]- データマッパーパターン - アクティブレコードにおいてはオブジェクト自体が永続化処理を行うのに対し、こちらではデータマッパーにオブジェクトを渡して永続化処理を行う[1]。
- オブジェクト関係マッピング
- メッセージ転送
外部リンク
[編集]- ^ “Data Mapper”. martinfowler.com. 2024年9月6日閲覧。