Active Recordの使い方
6. トランザクション
Active Recordのトランザクションは、データベース接続単位となります。ネスティッド・トランザクションには、SAVEPOINTを利用するかたちで対応しています。分散トランザクションには対応していません。以下に、トランザクション処理の例を示します。transactionメソッドのブロック内が、トランザクション処理です。このブロック内で例外が発生すると、ロールバックします。
TopicComment.transaction do @forum.save! @topic_comment.save! @topic.save! end
7. データベース・ビュー、既存テーブルなどへのマップ
場合によっては、データベース・ビューを定義してデータを取得したいケースがあります。作成したデータベース・ビューは、テーブルと同様にモデルにマップできます。しかし、マイグレーション・スクリプトでは、直接CREATE VIEWを実行して作成したり、テスト用データベースにもデータベース・ビューが作成されるようにしたり、といった工夫が必要になります。Rails 2.xであれば、rails_sql_viewsといったライブラリ(gem)を使用できます。
既存のデータベースを使用してRailsアプリケーションを作成する場合、テーブルの命名規則や構造がRailsのマッピング・ルールに合わないことがほとんどです。この場合、図3のように、ルールに一致しない箇所をすべて設定することにより、マップできるようになります。
図3: ルールに合わないテーブルへのマップ(クリックで拡大) |
モデルとテーブルのマップ以外に、テストで使用するFixture(テスト時に使用するサンプルデータ)のマッピングも行う必要があります。Fixtureに使用するYAMLファイルは、実際のテーブル名で作成する必要があります。図3の例では、r_product.ymlとr_inventory.ymlを作成します。この上で、test_helperに、以下のようにFixtureとモデルのマッピングを行います。
set_fixture_class :r_product => 'Product', :r_inventory => 'Inventory'
8. おわりに
今回は、Rails 3.0のActive Recordに着目して、その使い方を紹介しました。Active Recordひとつにしても、機能がたくさんあり、ここだけでは説明し切れていませんが、Railsアプリケーション開発時の参考にしていただければと思います。