2011年12月12日月曜日

[Rails3] 外部の Oracle DB に接続する(その2:Railsモデル編)

実行環境:
ruby 1.9.3
Rails 3.1.3
ruby-oci8 2.0.6
activerecord-oracle_enhanced-adapter 1.4.0
Rails3で外部のOracle DBにアクセスします。
その2:Railsモデル編としてRailsで接続できるようなモデルを作成します。

Oracle DBアダプタ(Gemファイル)のインストール

Railsアプリ内の Gemfile に以下の2行を追加します。
#{RAILS_ROOT}/Gemfile
gem 'ruby-oci8' gem 'activerecord-oracle_enhanced-adapter'
bundlerでインストールします。
$ bundle install

接続設定(database.yaml)

データベース接続の設定を行います。

①標準のDB(developmentやproduction)として外部のOracle DBを使う場合
デフォルトで Sqlite3 を使う設定になっているところを Oracle 用の設定に変更します。
#{RAILS_ROOT}/config/database.yml
development: adapter: oracle_enhanced database: [サービス名] username: [ユーザー名] password: [パスワード] production: adapter: oracle_enhanced database: [サービス名] username: [ユーザー名] password: [パスワード]
ここで書くサービス名などはローカル・ローミング・パラメータ、つまり tnsnames.ora ファイルで設定したものになります。詳しくは前回の記事 [Rails3] 外部のOracle DBに接続する(その1:準備編) を見て下さいね。

②標準のDBは内部のSqlite3を使い、特定のモデルだけで外部のOracle DBを使う場合
development:, test:, production: などは残しておいて、下記内容を追記する。
#{RAILS_ROOT}/config/database.yml
oracle_db: adapter: oracle_enhanced database: [サービス名] username: [ユーザー名] password: [パスワード]

外部DBへの接続のやり方については以前まとめました ⇒ [Rails3] ActiveReocrdで外部DBを使う

Scaffoldの作成

通常の Scaffold と同様に作成する。
$ rails generate scaffold user uid:integer name:string comment:string

既存のテーブル(レガシーDB)を使う場合は migration と timestamps をスキップするオプションをつけて作成するとよいと思います。
$ rails generate scaffold user uid:integer name:string comment:string --skip-migration --skip-timestamps
ここで指定するカラム名は使用するものだけでよい。(内部的にはテーブルのカラムを全て取ってくるので、ここで指定しなかったカラムでも view 等でアクセスできる。)

モデルの修正

①標準のDB(developmentやproduction)として外部のOracle DBを使う場合
特に修正の必要はありません。

②標準のDBは内部のSqlite3を使い、特定のモデルだけで外部のOracle DBを使う場合
接続先を通常のdevelopment/productionのDBではなく、oracle_dbで定義したものを使うように設定する。
#{RAILS_ROOT}/app/models/user.rb
class User < ActiveRecord::Base establish_connection(:oracle_db) set_table_name "[Oracleのテーブル名]" set_primary_key "uid" end
endの前の2行はOracleのテーブルがRailsの規約に従っていないときの措置です。テーブル名がモデル名(ここではusers)と一致しない場合は set_table_name で実際のテーブル名を指定する。主キー名がidでない場合は、set_primary_key で主キーとなるカラム名を指定する。

サーバーとして立ち上げて
$ rails server
ブラウザからアクセスしてみましょう。

0 件のコメント:

コメントを投稿