study2008_2

Ruby on Rails (RoR) 講習会
近畿大学大学院 田中大介
本日の目標
更にすげぇ
Webアプリケーションを作ろう!
本日の予定


Rails de XML
関連するテーブルを扱うアプリ


1対1、1対多、多対多
最終課題
Rails de XML

XMLとは?



タグを使用するマークアップ言語の一つ
インターネットでのデータ交換を意識して
作られた言語
Webサービスで利用されるRestやSOAP等の
基盤言語となっている
Rails de XML

XMLの利用例(マッシュアップ)

Weather Bonk

Googleの地図情報 + 天気の情報
⇒ 地図上に天気を表示
Rails de XML

XMLの利点

バイナリデータでなくテキストデータ


データの意味を保持できる


どんなコンピュータでも読むことができる
<値段>1,000<値段> のように
数字に意味を持たせることができる
データの構造を保持できる

タグの中にタグを入れることができるため
Rails de XML

形式毎に出力が分けられる

respond_to メソッド



format.html => htmlを要求されたときの出力
format.xml => XMLを要求されたときの出力
URLに「.xml」を追加するだけ
Rails de XML

実演
Rails de XML
SWF
アプリケーション
XML
DB
関連するテーブルを扱うアプリ

しくみ(例:Amazonの商品)
DB
商品テーブル
ID
商品名
1
アイス(ストロベリー)
2
3
値段
カテゴリ
300
食物
ジャケット(赤)
4,000
衣類
スプーン
1,000
食器
商品を売っている会社のデータを入れたい
関連するテーブルを扱うアプリ
商品(?)テーブル
ID
商品名
1
アイス(苺)
2
値段
カテゴリ
会社名
住所
電話
300
食物
CHN
東大阪
06-xxxx-xxxx
ジャケット(赤)
4,000
衣類
CHN
東大阪
06-xxxx-xxxx
3
スプーン
1,000
食器
田中店
寝屋川
072-yyy-yyyy
4
花
花
CHN
東大阪
06-xxxx-xxxx
5
カバン
雑貨
田中店
寝屋川
072-yyy-yyyy
500
10,000
電話番号が変更 ⇒ 全部変更しないといけない
関連するテーブルを扱うアプリ
商品テーブル
ID
商品名
1
アイス(苺)
2
値段
カテゴリ
会社テーブル
300
食物
ジャケット(赤)
4,000
衣類
ID
社名
住所
電話
3
スプーン
1,000
食器
1
CHN
東大阪
06-xxxx…
4
花
花
5
2
田中店
寝屋川
072-yyy….
カバン
500
10,000
雑貨
電話番号が変更 ⇒ 一箇所変更するだけで済む
テーブルの関連付け
関連するテーブルを扱うアプリ

データの正規化



テーブルに同じデータが含まれないように
テーブルを切り分けること
特にデータが大きくなる場合、
テーブルは正規化を行った方が良い
検索や更新の高速化、
冗長データの除去などの利点がある
関連するテーブルを扱うアプリ

テーブルの関連付け

商品:バーコード

商品1つに対してバーコードは1つ ⇒ 1対1
商品テーブル
ID
商品名
1
アイス(苺)
2
バーコードテーブル
カテゴリ
ID
番号
登録日時
300
食物
1
48aa…
08/01/01
ジャケット(赤)
4,000
衣類
2
48bb…
08/02/01
3
スプーン
1,000
食器
3
48cc…
08/03/01
4
花
花
4
48dd…
08/04/01
5
カバン
雑貨
5
48ee…
08/05/01
値段
500
10,000
関連するテーブルを扱うアプリ

テーブルの関連付け

商品:会社

会社1に対して商品は複数 ⇒ 1対多
商品テーブル
ID
商品名
1
アイス(苺)
2
値段
カテゴリ
会社テーブル
300
食物
ジャケット(赤)
4,000
衣類
ID
社名
住所
電話
3
スプーン
1,000
食器
1
CHN
東大阪
06-xxxx…
4
花
花
5
2
田中店
寝屋川
072-yyy….
カバン
500
10,000
雑貨
関連するテーブルを扱うアプリ

テーブルの関連付け

商品:購入者

商品1に対して購入者は複数 かつ
購入者1に対して商品も複数 ⇒ 多対多
商品テーブル
ID
商品名
1
アイス(苺)
2
値段
カテゴリ
ユーザテーブル
300
食物
ジャケット(赤)
4,000
衣類
ID
名前
住所
電話
3
スプーン
1,000
食器
1
森山
東大阪
06-xxxx…
4
花
花
5
2
田中
寝屋川
072-yyy….
カバン
500
10,000
雑貨
関連するテーブルを扱うアプリ

関連付けの方法

1対1、1対多


外部キーを用いる
多対多

関係テーブルを用いる
関連するテーブルを扱うアプリ

外部キー

別のテーブルの主キー(ID)
商品テーブル
ID
商品名
1
アイス(苺)
2
値段
カテゴリ
会社ID
300
食物
1
ジャケット(赤)
4,000
衣類
1
ID
社名
住所
電話
3
スプーン
1,000
食器
2
1
CHN
東大阪
06-xxxx…
4
花
花
1
5
田中店
寝屋川
072-yyy….
カバン
雑貨
2
2
500
10,000
会社テーブル
関連するテーブルを扱うアプリ

関係テーブル

テーブル間の関係を記録したテーブル
ID
商品名
1
アイス(苺)
2
値段
関連テーブル
カテゴリ
300
食物
ID
商品ID
ユーザID
ジャケット(赤)
4,000
衣類
1
1
1
3
スプーン
1,000
食器
2
1
2
4
花
花
3
2
1
5
カバン
雑貨
4
3
2
5
4
1
500
10,000
ID
名前
住所
電話
6
5
1
1
森山
東大阪
06-xxxx…
7
5
2
2
田中
寝屋川
072-yyy….
関連するテーブルを扱うアプリ

商品を管理するアプリケーション



1対1アプリケーション
(Product, Barcode)
1対多アプリケーション
(Product, Maker)
多対多アプリケーション
(Product, User)
関連するテーブルを扱うアプリ

商品を管理するアプリケーション

1対1アプリケーション

Product(商品)テーブル




商品名 ⇒ Name : String
値段 ⇒ Price : Integer
カテゴリ ⇒ Category : String
Barcode(バーコード)テーブル

番号 ⇒ Code : String
関連するテーブルを扱うアプリ
商品を管理するアプリケーション


1対1アプリケーション
1.
2.
3.
4.
ProductテーブルでScaffold
BarcodeテーブルでScaffold
関連性を記述
確認
関連するテーブルを扱うアプリ
商品を管理するアプリケーション


1対1アプリケーション
3.
関連性を記述

データベースに関連を追加
1.
generatorで、migrationを指定して
「add_rel_barcode_to_products」
2.
できたファイルのself.upメソッドに、
「add_column :products, :barcode_id, :integer」
3.
rake db:migrate
関連するテーブルを扱うアプリ

メソッド補足

Railsにはgeneratorという
コード生成プログラムがある





controller ⇒ コントローラとビューを生成
model ⇒ モデルを生成
scaffold ⇒ 雛形を一括作成
migration ⇒ マイグレーションファイル(DBの設計図)を生成
add_columnメソッド


カラムを追加するメソッド
add_column(カラムを追加するテーブル名, カラム名, 型)
関連するテーブルを扱うアプリ
商品を管理するアプリケーション


1対1アプリケーション
3.
関連性を記述

各モデルに関連性を追加

外部キーを持つモデル(今回はProduct)に
「belongs_to :barcode」

外部キーを持たないモデル(今回はBarcode)に
「has_one :product」
関連するテーブルを扱うアプリ
商品を管理するアプリケーション


1対1アプリケーション
4.
確認



new.html.erbに
<%= text_field :barcode, :code %>
product_controller.rbのcreateメソッドに
@barcode = Barcode.new(params[:barcode])
@product.barcode = @barcode
@product.save を
@product.save &&@barcode.save
show.html.erbに
<%= @product.barcode.code %>
関連するテーブルを扱うアプリ

メソッド補足

has_one





has_many





1対1の関係
指定したモデルが、このモデルの子であることを宣言
子は一つしか持てない
引数は単数形 (ex. has_one :product)
1対多、多対多の関係
指定したモデルが、このモデルの子であることを宣言
子を複数持つことができる
引数は複数形 (ex. has_one :products)
belongs_to



外部キーを設定したときに使用
指定したモデルが、このモデルの親であることを宣言
引数は単数形 (ex. has_one :product)
関連するテーブルを扱うアプリ

メソッド補足

has_one, has_many, belongs_to

「モデル. 設定したモデル」とすると、



設定したモデルのテーブルから
設定したモデル_idというカラムをもとに
関連するモデルを取得する
ex. @product.barcode



belongs_to :barcodeとしているので、
barcodeテーブルから、
barcode_idを使って関連するモデルを取得する
関連するテーブルを扱うアプリ

メソッド補足

text_field (モデル名, カラム名)




テキストを入力するhtmlフォームを作る
引数は(モデル名, カラム名)
inputタグのnameパラメータが、
”モデル名[カラム名]”に設定される
ボタンを押すと、フォームにある
各nameパラメータの値がparamsに格納される

ex. text_field(:barcode, :code)
⇒ <input type=“text” name=“barcode[code]”/>
⇒ params[:barcode][:code]に値が入る
関連するテーブルを扱うアプリ

商品を管理するアプリケーション

1対多アプリケーション

Product(商品)テーブル




商品名 ⇒ Name : String
値段 ⇒ Price : Integer
カテゴリ ⇒ Category : String
Maker(会社)テーブル



社名 ⇒ Name : String
住所 ⇒ Address : String
電話番号 ⇒ telephone : String
関連するテーブルを扱うアプリ
商品を管理するアプリケーション


1対多アプリケーション
1.
2.
3.
MakerテーブルでScaffold
関連性を記述
確認
関連するテーブルを扱うアプリ
商品を管理するアプリケーション


1対多アプリケーション
2.
関連性を記述


データベースに関連を追加
1.
generatorで、migrationを指定して
「add_rel_maker_to_products」
2.
できたファイルのself.upメソッドに、
「add_column :products, :maker_id, :integer」
3.
rake db:migrate
モデルに関連を追加(has_manyとbelongs_to)
関連するテーブルを扱うアプリ
商品を管理するアプリケーション


1対多アプリケーション
3.
確認




makerをいくつかいれる
new.html.erbに
<%= collection_select :maker, :id,
Maker.find(:all), :id, :name %>を追加
product_controllerのcreateメソッドに
@product.maker =
Maker.find(params[:maker][:id])を追加
show.html.erbに会社の情報を表示する
関連するテーブルを扱うアプリ

メソッド補足

collection_select


DBを利用してセレクトボックスを作成するメソッド
引数は以下の5つ






paramsに格納するモデル名
paramsに格納するカラム名
セレクトボックスに使用する配列
paramsに格納するカラム
セレクトボックスに表示するカラム
ex. collection_select(:maker, :id, Maker.find(:all), :id, :name)



全ての会社がセレクトボックスに表示される(3番目の引数)
セレクトボックスに表示されるのは会社の名前(5番目の引数)
params[:maker][:id]に値が格納される(1, 2番目の引数)
格納される値は、会社のID(4番目の引数)
関連するテーブルを扱うアプリ

商品を管理するアプリケーション

多対多アプリケーション

Product(商品)テーブル




User(顧客)テーブル




商品名 ⇒ Name : String
値段 ⇒ Price : Integer
カテゴリ ⇒ Category : String
名前 ⇒ Name : String
住所 ⇒ Address : String
電話番号 ⇒ Telephone : String
History(購入履歴)テーブル


商品ID ⇒ product_id
顧客ID ⇒ user_id
関連するテーブルを扱うアプリ
商品を管理するアプリケーション


多対多アプリケーション
1.
2.
3.
4.
5.
UserテーブルでScaffold
HistoryテーブルでScaffold
データベース更新(db:migrate)
関連性を記述
確認
関連するテーブルを扱うアプリ
商品を管理するアプリケーション


多対多アプリケーション
4.
関連性を記述

各モデルに関連を追加

Product.rbに
has_many :histories
has_many :users, :through => :historiesを追加

User.rbに
has_many :histories
has_many :products, :through => :historiesを追加

History.rbに
belongs_to :product
belongs_to :userを追加
関連するテーブルを扱うアプリ
商品を管理するアプリケーション


多対多アプリケーション
5.
確認



userをいくつかいれる
商品を売るuruメソッドを作成
show.html.erbで表示
総合練習

自分の役に立つアプリケーションを組んで
下さい
以上です

お疲れ様でした!
Pluginについて

Railsプラグイン


他の人が作った便利な追加機能
Railsでは、script/pluginで扱うことができる