OracleおよびRuby on Railsの使用

このチュートリアルでは、OracleとRuby/Railsのインストールおよび非常に効率的で機能的なRuby/Railsアプリケーションの開発方法を説明します。 エンタープライズの強力なRuby/Railsアプリケーションを作成するために必要な知識を習得できます。

このチュートリアルでは、以下のトピックについて説明します。

前提条件
1. 接続の作成
2. データの問合せ
3. バインド変数
4. データ型の定義
5. トランザクション管理
6. PL/SQLの使用
7. LOBの使用:イメージの格納/取得
8. XMLの使用
9. ActiveRecordの使用
10. Ruby On Rails(RoR):移行および足場
11. RoR:1対1の関係の表
12. RoR:1対多の関係の表
13. RoR:多対多の関係の表
まとめ
関連情報
付録:Ruby入門
付録:Railsの移行を使用したデータベース表の変更方法
付録:OracleとRuby on Railsのインストール

このアイコンの上にカーソルを置くと、すべてのスクリーンショットがロードし、表示されます。 (警告: すべてのスクリーンショットが同時にロードされるため、ご使用のインターネット接続によってはレスポンス・タイムが遅くなる場合があります。)

注: 各手順に関連したスクリーンショットのみを表示する場合は、それぞれの手順にあるアイコンの上にカーソルを置いてください。 スクリーンショットをクリックすると、非表示になります。

概要

Ruby on Railsは、速度を向上させてデータベース・ドリブンなWebサイトの作成を簡素化する無償のWebアプリケーション・フレームワークです。最初からスケルトン・コード・フレームワーク(足場)が提供されています。 一般的にRailsまたはRoRと呼ばれるRuby on Railsは、Rubyプログラミング言語で記述されたオープン・ソース・プロジェクトです。Railsフレームワークを使用したアプリケーションは、Model-View-Controller設計パターンで開発されます。

RoRは、J2EEおよびPHPプログラマの間で非常に注目を集めています。 RoRの長所を検討すると、J2EEおよびPHPプログラマが注目する理由がわかります。 たとえば、設計パターンの専門家が賞賛する厳密なModel-View-Controllerアーキテクチャを使用する点は、J2EE開発者にとって魅力的です。 また、Railsを使用した基本システムの構築の容易さは、PHP開発者にとって魅力的です。

RoRは、MVCの効果的なソリューションを提供します。 モデルは、データだけではありません。データに適用されるすべてのビジネス・ルールを施行します。 モデルは、ゲートキーパーおよびデータ・ストアとして機能します。 ビューでは、モデルのデータに基づくユーザー・インタフェースの作成を管理します。 ビューではユーザーによるさまざまなデータ入力を実行できますが、ビュー自体は入力データを処理しません。 ビューの機能は、データ表示のみです。 コントローラは、外部(通常、ユーザー入力)からイベントを受信し、モデルとやり取りして、ユーザーに適切なビューを表示します。

RoRは、オブジェクト・リレーショナル・マッピング(ORM)層としてActiveRecordを提供し、データベースの接続とデータの操作を行います。 ActiveRecordは、標準のORMモデル(表とクラス、行とオブジェクト、列とオブジェクト属性)に厳密に準拠します。

Railsアプリケーションが作成されると、ルートの下に次のディレクトリとファイルが作成されます。 app、components、config、db、doc、lib、log、public、Rakefile、README、script、test、tmp、vendor

Rubyは、簡易性と生産性に注目した動的なオープン・ソースのプログラミング言語です。 読みやすく書きやすい、優れた構文が提供されます。 Ruby言語の詳細は、付録:Ruby入門を参照してください。

詳細情報を取得するには、Ruby on Rails OTNフォーラム(US OTN 内の掲示板、英語)を参照してください。

トピック・リストに戻る

前提条件

この実践的なセッションには、以下を事前にインストールする必要があります。

1.

Oracle Database 11gをインストール済みであること。

2.

Oracle Instant ClientおよびOracleOnRails(ruby、rubygems、activesupport、activerecord、rake、ruby-oci8など)をインストール済みであること。また、スキーマを構成していること。 付録:OracleとRuby on Railsのインストールの手順を参照してください。

3.

prefetch.rbファイルをダウンロードして解凍していること。 ファイルには、このチュートリアルを実行するために必要なすべてのファイルが含まれます。

トピック・リストに戻る

1. 接続の作成

この項で使用するコマンドは、以下のとおりです。

OCI8.new (userid, password, dbname = nil, privilege = nil):

ユーザーIDおよびパスワードでOracleに接続します。 dbnameは、Net8の接続文字列です。 DBA権限が必要な場合、SYSDBAまたはSYSOPER権限を設定してください。

 

OCI8#logoff

Oracleの接続を解除します。 コミットされていないトランザクションはロールバックされます。

OCIError Oracleエラー・コードを使用した例外クラスです。 OCIError#messageによるエラー・メッセージとOCIError#codeによるエラー・コードを取得できます。

Rubyスクリプトの作成タスクでは、最初にデータベースの接続を作成します。 以下の手順を実行します。

1.

端末ウィンドウから、次のコマンドを実行してconnect.rbを実行します。

ruby connect.rb

接続に成功すると、次のメッセージが表示されます。接続に失敗すると、エラーが表示されます。

 

2.

このチュートリアルの残りのスクリプトに含まれるコマンドは、以下のとおりです。

require 'config.rb'

#create connection
conn = OCI8.new(DB_USER, DB_PASSWORD, DB_SERVER)

# operations on conn goes here

 #log out
conn.logoff

 

トピック・リストに戻る

2. データの問合せ

この項で使用するコマンドは、以下のとおりです。

OCI8#parse (sql)

カーソルを作成し、SQL文の実行を準備して、OCI8::Cursorインスタンスを返します。

OCI8#exec (sql, *bindvars)

SQL文を実行します。 戻り値のタイプは、SQL文のタイプによって異なります。 bindvarsを指定すると、実行前にバインド変数としてバインドされます。

OCI8::Cursor#exec(*bindvars) カーソルに割り当てられたSQL文を実行します。 戻り値のタイプは、SQL文のタイプによって異なります。
OCI8::Cursor#getColNames 選択リストの名前を配列で取得します。 exec後にこのメソッドを使用してください。

簡単な問合せを作成して結果を表示するには、以下の手順を実行します。

1.

端末ウィンドウから、次のコマンドを実行してfetch.rbスクリプトを実行します。

ruby fetch.rb

出力のスクリーンショットは、以下のとおりです。

 

トピック・リストに戻る

3. バインド変数

バインド変数を使用すると、コードの再利用性が向上し、SQLインジェクション攻撃のリスクがなくなります。 この項で使用するコマンドは、以下のとおりです。

OCI8::Cursor#bind_param(key, val, type = nil, length = nil)

明示的なバインド変数。 キーが数値の場合、1で始まる位置によってバインドされます。 キーが文字列の場合、プレースホルダの名前でバインドされます。

OCI8#exec (sql, *bindvars) or OCI8::Cursor#exec(*bindvars)

bindvarsで変数をバインドすることもできます。

OCI8::Cursor#[key] バインド変数の値を取得/設定します。

この例でバインド変数を使用するには、以下の手順を実行します。

1.

端末ウィンドウから、次のコマンドを実行してbind.rbスクリプトを実行します。

ruby bind.rb

出力のスクリーンショットは、以下のとおりです。

 

2.

バインド変数を使用してパフォーマンスの向上をテストするには、次のコマンドを実行してbind_perf_test.rbスクリプトを実行します。

ruby bind_perf_test.rb
出力のスクリーンショットは、以下のとおりです。 


 

トピック・リストに戻る

4. データ型の定義

この項で使用するコマンドは、以下のとおりです。

OCI8::Cursor#define(pos, type, length = nil)

parseおよびexec内でこのメソッドを使用します。posは1から開始されます。 タイプが文字列の場合に長さが使用されます。

フェッチした値のデータ型を明示的に示すことができます。 この例でデータ型を定義するには、以下の手順に従います。

1.

端末ウィンドウから、次のコマンドを実行してdefine.rbスクリプトを実行します。

ruby define.rb

出力のスクリーンショットは、以下のとおりです。

2つのブロック出力の違いを確認できます。

トピック・リストに戻る

5. トランザクション管理

Oracleデータベースのデータを操作する場合(データの挿入、更新、または削除)、変更されたデータや新しいデータは、データベースにコミットされるまでデータベース・セッション内でのみ使用できます。 変更されたデータがデータベースにコミットされた後は、他のユーザーおよびセッションでも使用できます。 これがデータベース・トランザクションです。

各変更を個別にコミットすると、サーバーに余分なロードが発生します。 通常、コミットされたデータをすべて使用するかまったく使用しないかのいずれかです。独自のトランザクション制御には、パフォーマンスとデータ整合性の利点があります。

この項で使用するコマンドは、以下のとおりです。

OCI8#autocommit

autocommitモードの状態を取得/設定します。 デフォルト値はfalseです(ログオフ時にコミットされていないトランザクションがロールバックされるので注意してください)。 trueの場合、挿入/更新/削除文を実行するたびにトランザクションが自動的にコミットされます。

OCI8#commit() トランザクションをコミットします。
OCI8#rollback() トランザクションをロールバックします。

トランザクションの管理方法を学習するには、以下の手順を実行します。

1.

端末ウィンドウから、次のコマンドを実行してtransaction.rbスクリプトを実行します。

ruby transaction.rb

このスクリプトは、conn1接続を使用して行を更新します。 Oracleの新しいデータは、コミットされるまで元のデータベース・セッションにのみ表示されます。 出力のスクリーンショットは、以下のとおりです。

この場合、conn2接続は、conn1のコミットされていないトランザクションで発生した内容を認識していません。

2.

transaction.rbスクリプトを更新し、conn1.autocommit = trueをコメントアウトして、ファイルを保存します。

次のコマンドを使用して、スクリプトを再実行します。

ruby transaction.rb

conn2が新しい内容を認識します。 出力のスクリーンショットは、以下のとおりです。

3.

各行を個別にコミットすると、サーバーに余分なロードが発生します。 各行の個別のコミット間とトランザクションの最後のパフォーマンスの違いを比較できます。 違いをテストするには、次のコマンドを使用してtrans_perf_test.rbスクリプトを実行します。

ruby trans_perf_test.rb

2つ目の数値が1つ目の数値より小さいことを確認します。 出力のスクリーンショットは、以下のとおりです。

トピック・リストに戻る

6. PL/SQLの使用

PL/SQLは、SQLを拡張したOracleの手続き型言語です。 PL/SQLストアド・プロシージャおよび関数がデータベースに格納されるので、迅速なアクセスが実現します。 PL/SQLストアド・プロシージャを使用すると、アプリケーションのデータベースへのアクセス方法に関係なくすべてのデータベース・アプリケーションでロジックを再利用できます。 データをプログラム(Rubyなど)に抽出して処理するよりも速く、多くのデータ関連操作をPL/SQLで実行できます。

この項で使用するコマンドは、以下のとおりです。

DBMS_UTILITYおよびDBMS_OUTPUT

Oracleストアド・パッケージ。 TO_CHARは、組込み関数です。

RubyスクリプトでPL/SQLプロシージャおよび関数を呼び出すには、以下の手順を実行します。

1.

端末ウィンドウから、次のコマンドを実行してplsql.rbスクリプトを実行します。

ruby plsql.rb

出力のスクリーンショットは、以下のとおりです。

トピック・リストに戻る

7. LOBの使用:イメージの格納/取得

Oracleキャラクタ・ラージ・オブジェクト(CLOB)およびバイナリ・ラージ・オブジェクト(BLOB)列(およびPL/SQL変数)は大量(ギガバイト)の文字とバイナリ・データを含みます。 この項で使用するコマンドは、以下のとおりです。

OCI8::BLOB#available

BLOBを使用できるかどうか確認します。 BLOBを使用するには、最初にEMPTY_BLOB()を挿入する必要があります。

OCI8::BLOB#read(size = nil) BLOBから最大サイズのバイトで読み取ります。サイズが省略される場合はファイルの最後まで読み取ります。
OCI8::BLOB#write(string) 特定の文字列をBLOBに書き込みます。

小さいアプリケーションを作成してデータベースにイメージをロードして表示するには、以下の手順を実行します。

1.

PNGファイルは、スクリプト・ファイルと同じフォルダにあります。 downloadというフォルダを作成します。 端末ウィンドウから、次のコマンドを実行してblob.rbスクリプトを実行します。

mkdir download
ruby blob.rb

出力のスクリーンショットは、以下のとおりです。

トピック・リストに戻る

8. XMLの使用

Oracleデータベースのすべてのエディションには、"XML DB"が含まれます。 このテストでは、OracleからRubyにXMLデータを返す基本事項を説明します。 この項で使用するコマンドは、以下のとおりです。

DBMS_XMLGEN.getxml (statement)

SELECT文に基づいて、リレーショナル・データからXMLを作成します。 CLOBが返されます。

Oracleの基本的なXML機能を学習するには、以下の手順を実行します。

1.

端末ウィンドウから、次のコマンドを実行してxml.rbスクリプトを実行します。

ruby xml.rb

出力のスクリーンショットは、以下のとおりです。

トピック・リストに戻る

9. ActiveRecordの使用

ActiveRecordは、ビジネス・オブジェクトとデータベース表に接続して、単一のラッピングでロジックとデータを表す永続的なドメイン・モデルを作成します。 これは、オブジェクト・リレーショナル・マッピング(ORM)設計パターンの実装です。 この例でActiveRecordを使用するには、以下の手順に従います。

1.

端末ウィンドウから、次のコマンドを実行してactiverecord.rbスクリプトを実行します。

ruby activerecord.rb

出力のスクリーンショットは、以下のとおりです。

トピック・リストに戻る

10. Ruby On Rails(RoR):移行および足場

このチュートリアルの後半では、以下の用語を使用します。

Rake
移行 開発者は、データ記述言語(DDL)の代わりにRubyでデータベース・オブジェクトを作成、変更、および削除できます。
足場 ActiveRecordクラスによって反映されるエントリを作成、編集、参照、削除できるデータの簡単なインタフェースを提供します。 足場が作成されると、そこにはコントローラ・ファイル(アプリケーション・ユーザーが次に移動するページを決定する)とビュー・ファイル(アプリケーション・ユーザーが参照するページをレンダリングする)が含まれます。

移行と足場を使用してRailsアプリケーションを作成するには、以下の手順を実行します。

1.

holappというもっとも基本的なRailsアプリケーションを作成します。 端末ウィンドウから、次のコマンドを実行します。

rails holapp
cd holapp
gedit config/database.yml

2.

config/database.ymlファイルのdevelopmentセクションを次の内容に置き換えて、ファイルを保存して閉じます。

development:
    adapter: oracle database: orcl11g     username: hr
    password: hr


3.

comicモデルを作成できます。 端末ウィンドウから、次のコマンドを実行します。

ruby script/generate model comic


 

4.

作成されたスクリプトを編集します。 端末ウィンドウで次のコマンドを入力します。

gedit db/migrate/001_create_comics.rb

 

5.

self.upセクションを次の内容に置き換えて、ファイルを保存して閉じます。

  def self.up
    create_table :comics do |t|
          t.column :name,:string
   t.column :description, :string
   t.column :price, :float
    end
  end

 

6.

データベースの移行にRakeを実行して、ターゲット表を作成できます。 端末ウィンドウで次のコマンドを入力します。

rake db:migrate

 

7.

次のコマンドを使用して、comicモデルの足場を作成できます。

ruby script/generate scaffold comic

 

8.

Webrickは、サーブレットを使用して機能を拡張するRubyで記述されたHTTPサーバー・ライブラリです。 次のコマンドを使用して、Webrickサーバーを起動できます。

ruby script/server

 

9.

アプリケーションを表示できます。 ブラウザ・ウィンドウを開いて、次のURLを入力します。

http://localhost:3000/comics

アプリケーションが正しく動作することを確認するために「New Comic」をクリックして、レコードを作成します。

 

トピック・リストに戻る

11. RoR:1対1の関係の表

1対1の関係は、表Aの1行が表Bの0行または1行と関連付けられていることを表します。 1対1の関係の表を使用したRailsアプリケーションを作成するには、以下の手順を実行します。

1.

別の端末ウィンドウを開いて、次のコマンドを実行します。

cd /home/oracle/Work/ruby/holapp
source /etc/bashrc

 

2.

注文および請求書のモデルを作成します。 端末ウィンドウから、次のコマンドを実行します。

ruby script/generate model order
ruby script/generate model invoice 

 

3.

作成されたスクリプトを編集します。 端末ウィンドウで次のコマンドを入力します。

gedit db/migrate/002_create_orders.rb

 

4.

self.upセクションを次の内容に置き換えて、ファイルを保存して閉じます。

  def self.up
   create_table :orders do |t|
      t.column :name, :string
      t.column :description, :string
    end
  end

 

5.

作成されたスクリプトを編集します。 端末ウィンドウで次のコマンドを入力します。

gedit db/migrate/003_create_invoices.rb

 

6.

self.upセクションを次の内容に置き換えて、ファイルを保存して閉じます。

 def self.up
   create_table :invoices do |t|
      t.column :order_id, :integer
      t.column :invoicetype, :string
      t.column :description, :string
      t.column :amount, :float
    end
end

 

7.

データベースの移行にRakeを実行して、ターゲット表を作成できます。 端末ウィンドウで次のコマンドを入力します。

rake db:migrate

 

8.

作成されたスクリプトを編集します。 端末ウィンドウで次のコマンドを入力します。

gedit app/models/order.rb

 

9.

ファイルの内容を以下に置き換えて、ファイルを保存して閉じます。

class Order < ActiveRecord::Base
   has_one :invoice
end

 

10.

作成されたスクリプトを編集します。 端末ウィンドウで次のコマンドを入力します。

gedit app/models/invoice.rb

 

11.

ファイルの内容を以下に置き換えて、ファイルを保存して閉じます。

class Invoice < ActiveRecord::Base
   belongs_to :order
end

 

12.

次のコマンドを使用して、注文モデルの足場を作成できます。

ruby script/generate scaffold order

 

13.

作成されたhtmlを編集します。 端末ウィンドウで次のコマンドを入力します。

gedit app/views/orders/list.rhtml

 

14.

Order.content_columnsをこのファイルのOrder.columnsに置き換えます。 ファイルを保存し、閉じます。

 

15.

次のコマンドを使用して、請求書モデルの足場を作成できます。

ruby script/generate scaffold invoice

 

16.

作成されたhtmlを編集します。 端末ウィンドウで次のコマンドを入力します。

gedit app/views/invoices/list.rhtml

 

17.

Invoice.content_columnsをこのファイルのInvoice.columnsに置き換えます。 ファイルを保存し、閉じます。

 

18.

アプリケーションを表示できます。 ブラウザ・ウィンドウを開いて、次のURLを入力します。

http://localhost:3000/orders

新しい注文を作成します。

 

19.

足場の作成時にデフォルトでコントローラ・ファイルがRailsによって作成されます。 これらのコントローラ・ファイルには、Railsによって作成されたデフォルト以外の方法でアプリケーションを操作する場合に、変更を要するデフォルトのアクションがあります。 端末ウィンドウで次のコマンドを入力します。

gedit app/controllers/invoices_controller.rb

 

20.

ファイルのcreateセクションを以下に置き換えて、ファイルを保存して閉じます。

def create 
   @order = Order.find(:first, :order => "id DESC") 
   @invoice = Invoice.new(params[:invoice])
   if @invoice.save
     if !@order.nil?
      @order.invoice = @invoice
     end
     flash[:notice] = 'Invoice was successfully created.'
     redirect_to :action => 'list'
   else
     render :action => 'new'    end
 end

 

21.

アプリケーションを表示できます。 ブラウザ・ウィンドウを開いて、次のURLを入力します。

http://localhost:3000/invoices

新しい請求書を作成します。 請求書を作成した後、作成した最後の注文に請求書が関連付けられていることがわかります。

 

トピック・リストに戻る

12. RoR:1対多の関係の表

1対多の関係は、表Aの1行が表Bの任意の行(0行、1行、または複数行)と関連付けられていることを表します。 1対多の関係の表を使用したRailsアプリケーションを作成するには、以下の手順を実行します。

1.

注文および請求書のモデルを作成します。 端末ウィンドウから、次のコマンドを実行します。

ruby script/generate model line_item

 

2.

作成されたスクリプトを編集します。 端末ウィンドウで次のコマンドを入力します。

gedit db/migrate/004_create_line_items.rb

 

3.

self.upセクションを次の内容に置き換えて、ファイルを保存して閉じます。

  def self.up
   create_table :line_items do |t|
      t.column :order_id, :integer
      t.column :subject, :string
      t.column :description, :string
    end
  end

 

4.

データベースの移行にRakeを実行して、ターゲット表を作成できます。 端末ウィンドウで次のコマンドを入力します。

rake db:migrate

 

5.

作成されたスクリプトを編集します。 端末ウィンドウで次のコマンドを入力します。

gedit app/models/order.rb

 

6.

次のようにhas_many :line_itemsエントリをファイルに追加します。 ファイルを保存し、閉じます。

class Order < ActiveRecord::Base
   has_one :invoice

has_many :line_items
end

 

7.

作成されたスクリプトを編集します。 端末ウィンドウで次のコマンドを入力します。

gedit app/models/line_item.rb

 

8.

ファイルの内容を以下に置き換えて、ファイルを保存して閉じます。

class LineItem< ActiveRecord::Base
   belongs_to :order
end

 

9.

次のコマンドを使用して、line_itemモデルの足場を作成できます。

ruby script/generate scaffold line_item

 

10.

作成されたhtmlを編集します。 端末ウィンドウで次のコマンドを入力します。

gedit app/views/line_items/list.rhtml

 

11.

LineItem.content_columnsをこのファイルのLineItem.columnsに置き換えます。 ファイルを保存し、閉じます。

 

12.

アプリケーションを表示できます。 ブラウザ・ウィンドウを開いて、次のURLを入力します。

http://localhost:3000/line_items

新しい注文を作成します。

 

13.

コントローラ・ファイルを変更します。 端末ウィンドウで次のコマンドを入力します。

gedit app/controllers/line_items_controller.rb

 

14.

ファイルの内容を以下に置き換えて、ファイルを保存して閉じます。

   def create
    @order = Order.find(:first, :order => "id DESC")
    @line_item = LineItem.new(params[:line_item])
    if @line_item.save
      if !@order.nil?
        @order.line_items << @line_item
      end
      flash[:notice] = 'LineItem was successfully created.'
      redirect_to :action => 'list'
    else
      render :action => 'new'
    end
  end

 

15.

アプリケーションを表示できます。 ブラウザ・ウィンドウを開いて、次のURLを入力します。

http://localhost:3000/line_items

2つの品目を作成します。 作成した最後の注文にこれらの品目が関連付けられていることがわかります。

 

トピック・リストに戻る

13. RoR:多対多の関係の表

多対多の関係は、表Aの任意の複数の行が表Bの任意の複数の行と関連付けられていることを表します。 多対多の関係の表を使用したRailsアプリケーションを作成するには、以下の手順を実行します。

1.

記事、著者、およびarticles_authorのモデルを作成します。 端末ウィンドウから、次のコマンドを実行します。

ruby script/generate model article
ruby script/generate model author
ruby script/generate model articles_author

 

2.

作成されたスクリプトを編集します。 端末ウィンドウで次のコマンドを入力します。

gedit db/migrate/005_create_articles.rb

 

3.

self.upセクションを次の内容に置き換えて、ファイルを保存して閉じます。

  def self.up
   create_table :articles do |t|
      t.column :title, :string
      t.column :abstract, :string
    end
  end

 

4.

作成されたスクリプトを編集します。 端末ウィンドウで次のコマンドを入力します。

gedit db/migrate/006_create_authors.rb

 

5.

self.upセクションを次の内容に置き換えて、ファイルを保存して閉じます。

  def self.up
   create_table :authors do |t|
      t.column :name, :string
      t.column :vocation, :string
    end
  end

 

6.

作成されたスクリプトを編集します。 端末ウィンドウで次のコマンドを入力します。

gedit db/migrate/007_create_articles_authors.rb

 

7.

self.upセクションを次の内容に置き換えて、ファイルを保存して閉じます。

  def self.up
   create_table :articles_authors do |t|
      t.column :article_id, :integer
      t.column :author_id, :integer
    end
  end

 

8.

データベースの移行にRakeを実行して、ターゲット表を作成できます。 端末ウィンドウで次のコマンドを入力します。

rake db:migrate

 

9.

作成されたスクリプトを編集します。 端末ウィンドウで次のコマンドを入力します。

gedit app/models/article.rb

 

10.

次のようにファイルの内容を置き換えます。 ファイルを保存し、閉じます。

class Article < ActiveRecord::Base
   has_and_belongs_to_many :authors set_sequence_name "ARTICLES_AUTHORS_SEQ"
end

 

11.

作成されたスクリプトを編集します。 端末ウィンドウで次のコマンドを入力します。

gedit app/models/author.rb

 

12.

次のようにファイルの内容を置き換えます。 ファイルを保存し、閉じます。

class Author < ActiveRecord::Base
   has_and_belongs_to_many :articles set_sequence_name "ARTICLES_AUTHORS_SEQ"
end

 

13.

次のコマンドを使用して、記事モデルの足場を作成できます。

ruby script/generate scaffold article

 

14.

作成されたhtmlを編集します。 端末ウィンドウで次のコマンドを入力します。

gedit app/views/articles/list.rhtml

 

15.

Article.content_columnsをこのファイルのArticle.columnsに置き換えます。ファイルを保存し、閉じます。

 

16.

次のコマンドを使用して、著者モデルの足場を作成できます。

ruby script/generate scaffold author

 

17.

作成されたhtmlを編集します。 端末ウィンドウで次のコマンドを入力します。

gedit app/views/authors/list.rhtml

 

18.

Author.content_columnsをこのファイルのAuthor.columnsに置き換えます。ファイルを保存し、閉じます。

 

19.

次のコマンドを使用して、articles_authorモデルの足場を作成できます。

ruby script/generate scaffold articles_author

 

20.

作成されたhtmlを編集します。 端末ウィンドウで次のコマンドを入力します。

gedit app/views/articles_authors/list.rhtml

 

21.

ArticlesAuthor.content_columnsをこのファイルのArticleAuthor.columnsに置き換えます。ファイルを保存し、閉じます。

 

22.

コントローラ・ファイルを変更します。 端末ウィンドウで次のコマンドを入力します。

gedit app/controllers/articles_controller.rb

 

23.

ファイルの内容を以下に置き換えて、ファイルを保存して閉じます。

   def create
    @author = Author.find(:first, :order => "id DESC")
    @article = Article.new(params[:article])
    if @article.save
      if !@author.nil?
        @author.articles << @article
      end
      flash[:notice] = 'Article was successfully created.'
      redirect_to :action => 'list'
    else
      render :action => 'new'
    end
  end

 

24.

端末ウィンドウで次のコマンドを入力します。

gedit app/controllers/authors_controller.rb

 

25.

ファイルの内容を以下に置き換えて、ファイルを保存して閉じます。

   def create
    @article = Article.find(:first, :order => "id DESC")
    @author = Author.new(params[:author])
    if @author.save
      if !@article.nil?
        @article.authors << @author
      end
      flash[:notice] = 'Author was successfully created.'
      redirect_to :action => 'list'
    else
      render :action => 'new'
    end
  end

 

26.

アプリケーションを表示できます。 ブラウザ・ウィンドウで、次のURLを入力します。

http://localhost:3000/articles

記事を作成します。

 

27.

ブラウザ・ウィンドウで、次のURLを入力します。

http://localhost:3000/authors

2人の著者を作成します。

28.

次のURLを入力すると、著者と記事の関連性を確認できます。

http://localhost:3000/articles_authors

 

29.

次のURLに戻って、3つの記事を作成します。

http://localhost:3000/articles

 

30.

次のURLを入力して、作成した記事が作成した最後の著者に関連付けられていることを確認します。

http://localhost:3000/articles_authors

 

トピック・リストに戻る

まとめ

このチュートリアルで学習した内容は、次のとおりです。

OracleとRuby on Railsのインストール

Rubyを使用したOracle Databaseの接続の作成

データの問合せ
バインド変数
データ型の定義
トランザクションの作成および管理
PL/SQLの使用
LOBを使用したイメージの格納および取得

XMLの使用

ActiveRecordの使用

Railsを使用したアプリケーションの作成

さまざまな関係の表の処理

トピック・リストに戻る

関連情報

http://www.rubyonrails.com/(英語)

http://www.ruby-lang.org/(英語)
Oracle製品FAQのRuby on Rails(英語)
OTNのRuby/Ruby On Railsフォーラム(英語)

トピック・リストに戻る

ここでは、Ruby言語の概要を説明します。 使用するオブジェクトは、以下のとおりです。 Rubyに精通している場合、この項をスキップして次の項に進んでください。


変数

$var #グローバル変数
@var  #インスタンス変数
VAR  #定数
SomeClass::VAR #クラス内の定数
varまたは_var  #ローカル変数


擬似変数


self、nil、true、false

FILE #現在のソース・ファイル
LINE #現在の行

配列


[1,2,3]

["dog", "cat", "pig"]は%w(dog cat pig)と同じ

[ 1, 'cat', 3.14 ]  

ハッシュ


{expr1 => exprA, expr2 => exprB }

hashvar = { 'dog' => 'Frank', 'cat' => 'Sissi', 'donkey' => 'Tim' }
hashvar.length # 3
hashvar['dog']   # "Frank"
hashvar['cow'] = 'Ethan'

範囲


expr1 .. expr2 #最後の要素を含む
expr1 ... expr2 #最後の要素を除く

文字列リテラル


#二重引用符で囲まれた文字列には式展開が適用されます
"remember to escape \" and \\ #{expression_substituted}"
#一重引用符で囲まれた文字列は評価されません
'remember to escape \' and \\ #{expression_not_substituted}'


イテレータ

 

[ 1, 1, 2, 3, 5 ].each {|val| print val, " " } # 1 1 2 3 5

  3.times do print "Ho! " end # Ho! Ho! Ho!

メソッドの呼出し

method(args1, arg2)

method(*array)、method(array_member1, array_member2, …)と同じ

演算子

+, -, *, /, %, **, &, |, ^, <<, >>, &&, ||
foo += 5
foo, bar, baz = 1, 2, 3
foo, bar = 1          # foo = 1; bar = nil
foo,*bar = 1, 2, 3          #foo = 1; bar = [2, 3]と同じ(複数の割当てを表す*を使用して配列を割り当てます)


開始ブロック

# beginは、大文字のBEGINとは異なります(まったく違う意味になります)
#expr1に例外が発生すると、rescueはexpr2を実行します。 kind_of?. else句によって実行されるerror_typeの照合は
#rescueの後にexpr1で例外が発生しない場合
#に実行されます。 ensure句は、伝播プロセス中に捕捉されない例外が存在する場合でも
#ブロックの終了時に必ず実行されます。

begin
  expr1..
[rescue [error_type,..]
  expr2..]..
[else
  expr3..]
[ensure
  expr4..]
end


ブロック

search_engines =
  %w[Google Yahoo MSN].map do |engine|
    "http://www." + engine.downcase + ".com"
  end


制御構造

falsenilはfalseです。他はすべてtrueです。

if expr [then]
  expr...
[elsif expr [then]
  expr...]...
[else
  expr...]
end

unless expr [then]
  expr...
[else
  expr...]
end

expr1 if expr2          #expr2がtrueの場合、expr1を実行します
expr1 unless expr2   #expr2がfalseの場合、expr1を実行します

# ===演算子を使用して、case文を比較します
case expr
[when expr [, expr]...[then]
  expr..]..
[else
  expr..]
end

while expr [do]
  #コードがここに設定されます
end

until expr [do]
  #コードがここに設定されます
end

expr1 while expr2              #expr2がtrueの間、expr1を評価します
expr1 untill expr2              #expr2がfalseの間、expr1を評価します
begin expr1 until expr2     #expr2がfalseの間、少なくとも1回expr1を評価します

for lhs... in expr [do]
  expr..
end

#ループ本文に使用できる2つの特別なキーワードがあります。
next      #もっとも内側のループの次の反復へジャンプします

redo    #ループ条件を確認しないでもっとも内側のループ
           #の現在の反復を再開します

トピック・リストに戻る

付録:Railsの移行を使用したデータベース表の変更方法

Railsで"comics"表に"t.column :price, :float"列を追加するには、以下の手順を実行します。

1.

comicモデルを作成できます。 端末ウィンドウから、次のコマンドを実行します。

ruby script/generate migration add_columns

 

2.

作成されたスクリプトを編集します。 端末ウィンドウで次のコマンドを入力します。

gedit db/migrate/008_add_columns.rb

 

3.

self.upセクションを次の内容に置き換えて、ファイルを保存して閉じます。

  def self.up
add_column :comics, :author, :string
  end

 

4.

データベースの移行にRakeを実行して、ターゲット表を作成できます。 端末ウィンドウで次のコマンドを入力します。

rake db:migrate

注: 列を削除するには、self.upメソッドに"remove_column :comics, :price"のような行を追加します。列の名前を変更するには、self.upメソッドに"rename_column :comics, :price, :new_price"のような行を追加します。列を変更するには、self.upメソッドに"change_column :comics, :price, :integer"のような行を追加します。
また、"rake db:migrate VERSION=xx"(xxはロールバックするバージョン)コマンドを発行して、移行操作をロールバックできます。

 

トピック・リストに戻る

付録:OracleとRuby on Railsのインストール

ここでは、Oracle Databaseを使用したRuby on Railsアプリケーションを実行するために必要なOracle Instant Client、Ruby、Ruby/OCI8、RubyGems、およびRailsのインストール方法を説明します。

1.

US OTNからOracle Instant Clientをダウンロードします。 端末ウィンドウを開いて、次のコマンドを実行します。

su
<password to root is oracle>

 

2.

Oracle Instant Clientソフトウェアは、標準のOracleクライアントをインストールせずに、またはORACLE_HOMEの作成なしでアプリケーションを実行できます。 Oracle Instant Clientをインストールするには、次のコマンドを実行します。

rpm -ivh oracle-instantclient-basic-10.2.0.3-1.i386.rpm
rpm -ivh oracle-instantclient-devel-10.2.0.3-1.i386.rpm

 

3.

libclntsh.so.10.1LD_LIBRARY_PATH環境変数で示されるライブラリ検索パスに設定されているディレクトリを追加する必要があります。 次のコマンドを入力して、bashプロファイルを更新します。

gedit /etc/bashrc

 

4.

次の行を/etc/bashrcファイルの最後に追加して、ファイルを保存してエディタを閉じます。

source /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/bin/oracle_env.sh
export LD_LIBRARY_PATH=/usr/lib/oracle/10.2.0.3/client/lib:$LD_LIBRARY_PATH

 

5.

次のコマンドを実行して、oracle_env.shスクリプトを実行します。

source /etc/bashrc

 

6.

Rubyをインストールするには、以下の手順を実行します。

tar -xzvf ruby-1.8.6.tar.gz
cd ruby-1.8.6
./configure
make
make install  

 

7.

RubyGemsは、サード・パーティ製のライブラリを公開および管理するRuby標準です。 RubyGemsをインストールするには、以下の手順を実行します。

cd ..
tar -xzvf rubygems-0.9.4.tar.gz
cd rubygems-0.9.4
ruby setup.rb

 

8.

Ruby/OCI8は、OCI8 APIを使用したOracleのRubyインタフェースです。 Ruby/OCI8をインストールするには、次のコマンドを実行します。

cd ..
tar -xzvf ruby-oci8-0.1.16.tar.gz
cd ruby-oci8-0.1.16
ruby setup.rb config --with-instant-client
ruby setup.rp setup
ruby setup.rb install

 

9.

Ruby DBIモジュールは、Perl DBIモジュールと似ているRubyスクリプトのデータベースに依存しないインタフェースを提供します。 Ruby/DBIをインストールするには、次のコマンドを実行します。

cd ..
tar -xzvf dbi-0.1.1.tar.gz
cd ruby-dbi
ruby setup.rb config --with=dbi
ruby setup.rp setup
ruby setup.rb install

 

10.

Railsとその依存性をローカルにインストールするには、次のコマンドを実行します。

cd ..
gem install activesupport-1.4.2.gem
gem install actionpack-1.13.3.gem
gem install active record-1.15.3.gem
gem install actionwebservice-1.2.3.gem
gem install rake-0.7.3.gem
gem install actionmailer-1.3.3.gem
gem install rails-1.2.3.gem

http://gems.robyforge.orgからリモートのgemにアクセスできる場合、次のコマンドを実行してRailsとその依存性をリモート・インストールできます。 gemファイルを手動でダウンロードする必要がないため、これは非常に効率的です。

gem install rails --include-dependencies

 

トピック・リストに戻る

このアイコンの上にカーソルを置くと、すべてのスクリーンショットが非表示になります。

 


Copyright (c) Oracle Corporation 2007 All Rights Reserved
Oracle Corporation発行の「Using Oracle and Ruby on Rails」の翻訳版です。

この文書はあくまで参考資料であり、掲載されている情報は予告なしに変更されることがあります。 万一、誤植などにお気づきの場合は、オラクル社までお知らせください。 オラクル社は本書の内容に関していかなる保証もしません。 また、本書の内容に関連したいかなる損害についても責任を負いかねます。

Oracleはオラクル社の登録商標です。
その他の会社名および製品名は、 あくまでその製品および会社を識別する目的にのみ使用されており、 それぞれの所有者の商標または登録商標です。