2. ActiveRecord(1)
2012/09/24 シナジーマーケティング(株) 鈴木 圭
Model 2章 ActiveRecord
- 2.1. ActiveRecord とは
- 2.2. モデルの定義
- 2.3. クエリとメソッドチェイン
- 2.4. オブジェクトの登録, 更新
- 2.5. オブジェクトの検索
- 2.6. オブジェクトの削除
- 2.7. まとめ
2.1. ActiveRecord とは
2.1.1. ActiveRecord パターン
デザインパターンに ActiveRecord パターン 1 というものがありますが、
ActiveRecord とは、その名の通り ActiveRecord パターンを実現する OR マッパーです。
ActiveRecord パターンを簡単に説明すると以下のようになります。
- モデル 2 はテーブルを表す。
- モデルのインスタンスはレコードを表す。
- レコードの CRUD (登録、参照、更新、削除) はモデルのメソッドで行う。
例えば、ユーザ情報を保持するテーブル users とモデルクラス User があるとして上記説明に当てはめると以下のようになります。
- User クラスは users テーブルを表す。
- User クラスのインスタンスは users テーブルのレコードを表す。
- レコードの CRUD (登録、参照、更新、削除) は User クラスのクラスメソッドもしくはインスタンスメソッドで行う。
このように ActiveRecord はモデルとリレーショナルデータベースを結び付けます。
2.1.2. 名前に関する規約
ActiveRecord の大きな特徴の一つとして、設定の記述が最小限であることが挙げられます。
Ruby on Rails の設計思想に「DRY: Don’t Repeat Yourself (同じことを繰り返さない)」や
「CoC: Convension over Configuration (設定よりも規約)」があることは
「Ruby on Rails とは」 で述べました。
ActiveRecord はモデルとテーブルについて、名前のマッピングルールを規約として持っています。
例として、モデルのクラス名が User であるとします。
この場合は、「User」を小文字の複数形に直した「users」が、User モデルに対応するテーブルとなります。
この規約に従っていれば、「このモデルはこのテーブルに対応する」という設定を記述する必要はありません。
また、カラムに対応するモデルの属性を明示的に定義する必要もありません。
ActiveRecord はテーブルのスキーマ情報を実行時に取得し、モデルの属性を自動的に定義します。
以上のように、ActiveRecord はモデルとリレーショナルデータベースを最小限の設定で結び付ける OR マッパーです。
2.2. モデルの定義
モデルを定義するには ActiveRecord::Base を継承したクラスを作成します。3
クラスを定義したファイルは app/models/ 以下に配置します。
ここでは以下のユーザ情報を保持する users テーブルに対するモデル User を定義します。
論理名 | 物理名 | データ型 |
---|---|---|
ID | id | 主キー(primary_key) |
名前 | name | 文字列(string) |
メールアドレス | 文字列(string) | |
登録日時 | created_at | タイムスタンプ(timestamp) |
更新日時 | updated_at | タイムスタンプ(timestamp) |
User クラスを生成するために以下のコマンドを実行します。
rails generate model user name:string email:string
コマンドを実行すると、以下の内容の app/models/user.rb が作成されます。
class User < ActiveRecord::Base attr_accessible :email, :name end
この時点で基本的な CRUD (登録、参照、更新、削除) を行うことができます。
# (1) User オブジェクトを作成. user = User.new user.name = 'taro' user.email = '[email protected]' # (2) 登録. user.save # (3) 参照: 名前が 'taro' であるユーザを検索. taro = User.where(:name => 'taro').first # (4) 更新. taro.name = 'たろう' taro.save # (5) 削除. taro.destroy
上記のコードで行っていることを一つずつ確認しましょう。
(1) では User オブジェクトを作成し、その属性である name と email に値を設定しています。
name や email などの属性は、スキーマ情報から自動的に定義されるため、
User クラス定義時に特別な設定を行うことなく、「user.name = ’taro’」のように値を設定することができます。
(2) では save メソッドを実行し、作成した User オブジェクトを保存しています。
この時点でデータベースに対して SQL の INSERT 文が実行されます。
(3) では名前が「taro」であるユーザを検索を行っています。
検索条件は where メソッドで指定し、first メソッドで条件を満たす最初の 1 件が取得されます。
データベースには「SELECT * FROM users WHERE name=‘taro’ LIMIT 1」が実行されます。
(4) では名前を「taro」から「たろう」に変更し、更新しています。
データベースに対しては、UPDATE 文が実行されます。
(2) と同じ save メソッドを使用していますが、
内部的にデータベースに登録済みかどうか判別され、INSERT 文と UPDATE 文の適切な SQL が実行されます。
(5) では destroy メソッドでオブジェクトを削除しています。
データベースに対しては DELETE 文が実行されます。
モデルには入力値の検証やコールバックの設定、関連の設定などを行うこともできます。
それらについては、順を追って解説します。
1 ActiveRecord パターン は Martin Fowler 氏により記述されたデザインパターンです。 こちら でも詳しく紹介しています。
2 「モデル」とは MVC (Model-View-Controller) における M (Model) です。
3 正確には、ActiveRecord を利用するモデルを定義する場合に ActiveRecord::Base クラスを継承します。モデルの基本的な振る舞いは ActiveModel というモジュールに切り分けられています。例えば、検索フォームの値を受け取るためのモデルを作る場合には、値をデータベースに保存しないので、ActiveModel を直接利用します。