「Active Record」の版間の差分
→C#: Active Recordの例とは言い難いサンプルだったので全削除(ノート参照) |
|||
11行目: | 11行目: | ||
広く使われている実装のひとつは、[[Ruby on Rails]] のActive Recordの実装である。例えば、id 列(シリアルな主キー)、name 列(varchar 型)、price 列(money 型あるいは double 型)を持った parts テーブルがあれば、次のようなコードになる。 |
広く使われている実装のひとつは、[[Ruby on Rails]] のActive Recordの実装である。例えば、id 列(シリアルな主キー)、name 列(varchar 型)、price 列(money 型あるいは double 型)を持った parts テーブルがあれば、次のようなコードになる。 |
||
< |
<syntaxhighlight lang="rails"> |
||
a = Part.new |
a = Part.new |
||
a.name = "Sample part" |
a.name = "Sample part" |
||
a.price = 123.45 |
a.price = 123.45 |
||
a.save |
a.save |
||
</syntaxhighlight> |
|||
</source> |
|||
上記のコードは与えられた値で新しい行をデータベースに作る。これは次の [[SQL]] コマンドにほぼ等価である。 |
上記のコードは与えられた値で新しい行をデータベースに作る。これは次の [[SQL]] コマンドにほぼ等価である。 |
||
< |
<syntaxhighlight lang="sql"> |
||
INSERT INTO parts (name, price) VALUES ('Sample part', 123.45); |
INSERT INTO parts (name, price) VALUES ('Sample part', 123.45); |
||
</syntaxhighlight> |
|||
</source> |
|||
逆<!--方向-->に、データベースを検索するためこのクラスを用いることもできる。 |
逆<!--方向-->に、データベースを検索するためこのクラスを用いることもできる。 |
||
< |
<syntaxhighlight lang="rails"> |
||
widgetname = "gearbox" |
widgetname = "gearbox" |
||
b = Part.where(:name => widgetname).first |
b = Part.where(:name => widgetname).first |
||
</syntaxhighlight> |
|||
</source> |
|||
このコードは、<!-- データベースにおいて、--><code>name</code> 列が [[Ruby]] 変数 <code>widgetname</code> の値<!-- と等しい名前の-->一致する最初の行<!--から-->を取得して、オブジェクトを生成する。取得については、<!-- これは-->次の SQL コマンドと<!-- おおよそ同じだ。-->同義であるが、前述のrubyコードにそれは現れない。 |
このコードは、<!-- データベースにおいて、--><code>name</code> 列が [[Ruby]] 変数 <code>widgetname</code> の値<!-- と等しい名前の-->一致する最初の行<!--から-->を取得して、オブジェクトを生成する。取得については、<!-- これは-->次の SQL コマンドと<!-- おおよそ同じだ。-->同義であるが、前述のrubyコードにそれは現れない。 |
||
< |
<syntaxhighlight lang="sql"> |
||
SELECT * FROM parts WHERE name = 'gearbox' LIMIT 1; |
SELECT * FROM parts WHERE name = 'gearbox' LIMIT 1; |
||
</syntaxhighlight> |
|||
</source> |
|||
別の方法として、上記のコードは次のように短くすることもできる。 |
別の方法として、上記のコードは次のように短くすることもできる。 |
||
< |
<syntaxhighlight lang="rails"> |
||
b = Part.find_by_name("gearbox") |
b = Part.find_by_name("gearbox") |
||
</syntaxhighlight> |
|||
</source> |
|||
== 脚注 == |
== 脚注 == |
2020年7月5日 (日) 22:48時点における版
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日). 2014年4月8日閲覧。