2007年09月11日

Ruby on RailsをEclipseでいこう その8 〜PKが複合キーだよの巻〜

今日は、PKが複合キーの場合です。

Ruby on Railsは複合キーをサポートしないため、Composite Primary Keys
にあるように以下のコマンドをDOSコマンドプロンプトから実行して、拡張モジュールをインストールします。

>gem install composite_primary_keys

インストールができたら、Railsプロジェクトの
/config/environment.rbの末尾に以下の文を追加します。
require 'composite_primary_keys'

次に以下のDBテーブルを作成しましょう。
CREATE TABLE bookmark (
bookmark_id INTEGER(11) NOT NULL,
branch_no INTEGER(10) UNSIGNED NOT NULL,
url VARCHAR(255) NOT NULL,
PRIMARY KEY(bookmark_id, branch_no)
);

そして、EclipseのRadRailsのジェネレータタブからscaffoldを以下のように実行しましょう。
(ActiveRecord::Base.pluralize_table_names = falseの設定が前提です。)

scaffold Bookmark Bookmark

できあがった/models/bookmark.rbを以下のように改造します。

(変更前)
class Bookmark < ActiveRecord::Base
end

(変更後)
class Bookmark < ActiveRecord::Base
set_primary_keys :bookmark_id, :branch_no

#"branch_no"は"1"固定にしています。とりあえずね。
def before_create
self.id = [ self.bookmark_id_next, 1 ]
end

def bookmark_id_next
return ActiveRecord::Base.connection.select_value('select ifnull(max(bookmark_id),0)+1 from bookmark')
end
end


いつものようにWEBrickで確認しましょう(http://localhost:3000/bookmark)←実際は全部半角小文字

ただし、登録フォームに"branch_no"がありますが、/models/bookmark.rbで"1"固定にしているので、画面からの入力値は無視されます。


posted by 台北猫々 at 19:25| Comment(0) | TrackBack(0) | 技術メモ(Ruby)

2007年09月10日

Ruby on RailsをEclipseでいこう その7 〜AutoIncrementでないPKに対応の巻〜

今日は、その6で作成した"Item"テーブルのPKの列名を変更("id"→"item_id")し、かつ、AutoIncrementオプションをはずします。

ALTER TABLE `ruby`.`item` CHANGE COLUMN `id` `item_id` INTEGER UNSIGNED NOT NULL DEFAULT 0,
DROP PRIMARY KEY,
ADD PRIMARY KEY USING BTREE(`item_id`);

/models/item.rbの内容を以下のように書き換えます。
(変更前)
class Item < ActiveRecord::Base
end

(変更後)
class Item < ActiveRecord::Base
set_primary_key "item_id" #PK列名を変更します。

def before_create #insert実行直前に自動的に呼ばれます。
self.id = self.item_id_next
end

def item_id_next #自前で一意キーを取得します。
return ActiveRecord::Base.connection.select_value('select ifnull(max(item_id),0)+1 from item')
#ifnullを追加(2007/09/11),1レコード目のsaveでエラーになるため end
end

※before_create中の代入式の左辺の変数名は、PK列名に関わらず"id"になります。(う〜ん、これってPKが複合キーの場合はどうなるんだろう?)


posted by 台北猫々 at 21:56| Comment(0) | TrackBack(0) | 技術メモ(Ruby)

2007年09月09日

Ruby on RailsをEclipseでいこう その6 〜規約外テーブルへのscaffoldの巻〜

複数形テーブル名規約をはずして、scaffoldしてみます。

DBテーブルは以下のものを準備します。
CREATE TABLE `ruby`.`item` (
`id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`url` VARCHAR(255) NOT NULL,
`title` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`)
)
ENGINE = MyISAM;

先ずは、/config/environment.rbの末尾に以下の行を追加します。
(# Include your application configuration below の下)
ActiveRecord::Base.pluralize_table_names = false

さらにEclipseの右下にあるRailsビューの「ジェネレータ」タブを開きます。

上の画像のように「model」を選択して、「Item」と入力して実行ボタンをクリックします。

生成された/models/item.rbを開いて以下のように変更します。

class Item < ActiveRecord::Base
set_table_name "item" # ←この行を追加
end


さらにさらにEclipseの右下にあるRailsビューの「ジェネレータ」タブを開きます。

ruby_eclipse_pluralize_false02.jpg

上の画像のように「scaffold」を選択して、「Item Item」と入力して実行ボタンをクリックします。
※Usage : scaffold テーブル名 [コントローラ名]
テーブル名内に大文字があると、自動的にアンダースコア("_")が挿入されてしまうので注意です。
→ "SampleTable" は "sample_table"として扱われる。

いつものようにWEBrickで確認しましょう(http://localhost:3000/item)←実際は全部半角小文字

これで、規約外(テーブル名が複数形でない)のDBテーブルに対するCRUDアプリが自動生成できます。

Web上では、scaffoldは既存のmodelを読み込まない障害があるという情報もありましたが、現在では解決しているようですね勘違いでした。scaffoldは、modelの中を見ていません。scaffoldの引数で渡される「テーブル名」でDBから情報を引っ張ります(2007/09/10)。
猫
posted by 台北猫々 at 08:55| Comment(0) | TrackBack(0) | 技術メモ(Ruby)

2007年09月07日

Ruby on RailsをEclipseでいこう その5 〜primary key列名の変更の巻〜

Ruby on Railsの有名な規約として、テーブルのPKは1つで、列名は"id"にするというのがあります。

この規約の内、列名の方をはずしてみます。

先ずはテーブルの定義を変更しましょう。
(PKの"id"列の列名を"customer_id"に変更します)
ALTER TABLE `ruby`.`samples` CHANGE COLUMN `id` `customer_id` INTEGER UNSIGNED NOT NULL DEFAULT NULL AUTO_INCREMENT,
DROP PRIMARY KEY,
ADD PRIMARY KEY USING BTREE(`customer_id`);

そして、
その4のScaffoldで作成したモジュールの中の/app/models/sample.rbに1行追加します。

class Sample < ActiveRecord::Base
set_primary_key "customer_id" # ←PK列名の指定追加
end

とりあえず、これでいけます。猫
posted by 台北猫々 at 22:21| Comment(0) | TrackBack(0) | 技術メモ(Ruby)

2007年09月06日

Ruby on RailsをEclipseでいこう その4 〜Scaffoldの巻〜

Ruby on RailsのアピールポイントであるScaffoldを使ってみます。

その2で作成したRailsプロジェクトを開きます。さらにEclipseの右下にあるRailsビューの「ジェネレータ」タブを開きます。

ruby_eclipse_scaffold01.jpg

上画像のように「scaffold」を選択して、「Sample Sample」と入力して実行ボタンをクリックします。
※Usage : scaffold モデル名 [コントローラ名]

ruby_eclipse_scaffold02.jpg

「コンソール」タブに作成されてファイルの一覧が表示されます。

その3のように、WEBrickサーバを起動して、Eclipseの内部ブラウザを起動します。
以下の画像内のURLにアクセスしましょう。(http://localhost:3000/sample/)←実際は全部半角小文字

ruby_eclipse_scaffold03.jpg

上画像のように、作成したWebアプリのトップページが表示されると成功です。Sampleテーブルに対してCRUDできるWebアプリの出来上がりです。

この辺はRuby on Railsで一番アピールされるポイントですね。確かに、15分くらいでDBテーブルのメンテナンスWebアプリができます。

しかし、これから先が段々と情報が少なくなる領域に入っていきます猫
posted by 台北猫々 at 22:00| Comment(0) | TrackBack(0) | 技術メモ(Ruby)

2007年09月05日

Ruby on RailsをEclipseでいこう その3 〜DB環境準備の巻〜

DBはMySQLを使用します。
私の場合はXAMPPで入れてしまっています。

MySQLにデータベースとユーザを準備します。
お試し用として以下の感じにします。当たり前ですが、作成するユーザは"ruby"データベースへのアクセス権限が必要です。
データベース名:ruby
ユーザ:ruby
パスワード:ruby
MySQL AdministratorなどのGUIツールを使うと楽チンです。

さらにお試し用テーブルを作成します。
(AUTO_INCREMENTを追記 2007/9/6)
CREATE TABLE `ruby`.`samples` (
`id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(45) NOT NULL,
PRIMARY KEY (`id`)
)
ENGINE = MyISAM;

さらにさらに、その2で作成したRailsプロジェクト内のconfig/database.ymlを編集します。[development]セクションを以下のようにします。他のセクションはとりあえず置いておきます。

development:
adapter: mysql
database: ruby
username: ruby
password: ruby
host: localhost

これでDB環境の準備は整いました。猫


posted by 台北猫々 at 21:07| Comment(0) | TrackBack(0) | 技術メモ(Ruby)

2007年09月04日

Ruby on RailsをEclipseでいこう その2

Ruby on Railsのプロジェクトを作成しましょう。
メニューバーの「ファイル」→「新規」→「プロジェクト」で以下のウインドウを開いて、

ruby_eclipse_new_project01.jpg

Railsプロジェクトを選択して、「次へ」をクリックします。すると次のページが表示されます。

ruby_eclipse_new_project02.jpg

とりあえずデフォルトオプションで作成します。

ruby_eclipse_new_project03.jpg

これでプロジェクトを作成できました。ついでに内臓Ruby(Web)サーバのWEBrickサーバの動作を見ましょう。Eclipseの右下のビューの「サーバ」タブをクリックします。以下のようにサーバが一つ表示されます。

ruby_eclipse_new_project04.jpg

サーバ行を選択反転して「起動」させましょう。そして、Eclipseの内部ブラウザを起動して、以下の画像内のURLにアクセスしましょう。(http://localhost:3000/)←実際は全部半角小文字

ruby_eclipse_new_project05.jpg

上の画像内のような画面が表示されればOK猫


posted by 台北猫々 at 21:41| Comment(0) | TrackBack(0) | 技術メモ(Ruby)

2007年09月02日

Ruby on RailsをEclipseでいこう

とりあえず、
AmaterasIDE InstallerからEclipseのインストーラーをダウンロードして、Eclispe(3.2.2)をインストールします。

次に
AptanaEclipseプラグインをインストールします。

さらに
Eclipseのメニューバー→ウインドウ→設定で、設定ウインドウを開き「Ruby」と「Rails」にRuby環境のパス情報を設定します。

「Ruby」の「インストール済みのインタプリター」で以下の設定
 C:\usr\local\ruby

ruby_eclipse_set1.jpg

「Rails」の「構成」で以下を設定
「Railsパス」→C:\usr\local\ruby\bin\rails
「Rakeパス」→C:\usr\local\ruby\bin\rake
ruby_eclipse_set2.jpg

これで、Eclipse+Ruby on Rails環境完成です!
posted by 台北猫々 at 10:22| Comment(0) | TrackBack(0) | 技術メモ(Ruby)

2007年09月01日

Ruby on Railsせっとあっぷ

とりあえずRubyをインストールします。
環境はWindowsXP SP2

RubyForgeのOne-Click Installer - Windows
からruby186-25.exeをダウンロードします。

ruby186-25.exeを実行して、c:\usr\local\ruby(私の場合)にインストールします。この時のインストールコンポーネント↓です。この後、RailsをインストールするのにRubyGemsが必要になるので忘れないようにインストールします。

ruby_install_component.jpg

そして、いよいよRuby on Railsをインストールします。コマンドプロンプトで以下のコマンドを実行します(インタネット環境が前提です)。
gem install rails --include-dependencies

↓こんなふうにインストールされます。

>>gem install rails --include-dependencies
Bulk updating Gem source index for: http://gems.rubyforge.org
Successfully installed rails-1.2.3
Successfully installed activesupport-1.4.2
Successfully installed activerecord-1.15.3
Successfully installed actionpack-1.13.3
Successfully installed actionmailer-1.3.3
Successfully installed actionwebservice-1.2.3
Installing ri documentation for activesupport-1.4.2...
Installing ri documentation for activerecord-1.15.3...
Installing ri documentation for actionpack-1.13.3...
Installing ri documentation for actionmailer-1.3.3...
Installing ri documentation for actionwebservice-1.2.3...
Installing RDoc documentation for activesupport-1.4.2...
Installing RDoc documentation for activerecord-1.15.3...
Installing RDoc documentation for actionpack-1.13.3...
Installing RDoc documentation for actionmailer-1.3.3...
Installing RDoc documentation for actionwebservice-1.2.3...
posted by 台北猫々 at 22:32| Comment(0) | TrackBack(0) | 技術メモ(Ruby)

2007年08月21日

Ruby on RailsのO/Rマッピング規約の解除

Ruby on RailsのActiveRecordのクラス名とテーブル名の規約
→ テーブル名(複数形)−クラス名(単数形)
を解除する設定

config/environment.rbに
ActiveRecord::Base.pluralize_table_names = false
を記述する。

#そういえば、複数形がない名詞の場合ってどうなるんだろう。
#今度調べてみよう猫
posted by 台北猫々 at 22:21| Comment(0) | TrackBack(0) | 技術メモ(Ruby)