Active Recordの使い方

2010年10月13日(水)
朝倉 慎一

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アプリケーション開発時の参考にしていただければと思います。

株式会社日立ソリューションズ

技術開発本部 Rubyセンタ所属
1973生まれ。入社後、グループウェア、Webアプリケーションサーバなどの技術サポート業務に従事。現在は、RubyおよびRuby on Railsを中心にしたビジネスを推進中。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています