ruby on rails (ror) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ...
Post on 19-Dec-2015
230 views
TRANSCRIPT
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
DBSWF アプリケーション
XML
関連するテーブルを扱うアプリ しくみ(例: Amazon の商品)
ID 商品名 値段 カテゴリ
1 アイス(ストロベリー)
300 食物
2 ジャケット(赤) 4,000 衣類3 スプーン 1,000 食器
商品テーブルDB
商品を売っている会社のデータを入れたい
関連するテーブルを扱うアプリ
ID 商品名 値段 カテゴリ
会社名 住所 電話
1 アイス(苺) 300 食物 CHN 東大阪 06-xxxx-xxxx
2 ジャケット(赤)
4,000 衣類 CHN 東大阪 06-xxxx-xxxx
3 スプーン 1,000 食器 田中店 寝屋川 072-yyy-yyyy
4 花 500 花 CHN 東大阪 06-xxxx-xxxx
5 カバン 10,000
雑貨 田中店 寝屋川 072-yyy-yyyy
商品(?)テーブル
電話番号が変更 ⇒ 全部変更しないといけない
関連するテーブルを扱うアプリ
ID 商品名 値段 カテゴリ
1 アイス(苺) 300 食物2 ジャケット
(赤)4,000 衣類
3 スプーン 1,000 食器4 花 500 花5 カバン 10,00
0雑貨
商品テーブル
ID 社名 住所 電話
1 CHN 東大阪 06-xxxx…
2 田中店 寝屋川 072-yyy….
会社テーブル
電話番号が変更 ⇒ 一箇所変更するだけで済む
テーブルの関連付け
関連するテーブルを扱うアプリ データの正規化
テーブルに同じデータが含まれないようにテーブルを切り分けること
特にデータが大きくなる場合、テーブルは正規化を行った方が良い
検索や更新の高速化、冗長データの除去などの利点がある
関連するテーブルを扱うアプリ テーブルの関連付け
商品:バーコード 商品 1 つに対してバーコードは 1 つ ⇒ 1 対 1
ID 商品名 値段 カテゴリ
1 アイス(苺) 300 食物2 ジャケット
(赤)4,000 衣類
3 スプーン 1,000 食器4 花 500 花5 カバン 10,00
0雑貨
商品テーブルID 番号 登録日時1 48aa… 08/01/01
2 48bb… 08/02/01
3 48cc… 08/03/01
4 48dd… 08/04/01
5 48ee… 08/05/01
バーコードテーブル
関連するテーブルを扱うアプリ テーブルの関連付け
商品:会社 会社 1 に対して商品は複数 ⇒ 1 対多
ID 商品名 値段 カテゴリ
1 アイス(苺) 300 食物2 ジャケット
(赤)4,000 衣類
3 スプーン 1,000 食器4 花 500 花5 カバン 10,00
0雑貨
商品テーブル
ID 社名 住所 電話
1 CHN 東大阪 06-xxxx…
2 田中店 寝屋川 072-yyy….
会社テーブル
関連するテーブルを扱うアプリ
ID 商品名 値段 カテゴリ
1 アイス(苺) 300 食物2 ジャケット
(赤)4,000 衣類
3 スプーン 1,000 食器4 花 500 花5 カバン 10,00
0雑貨
商品テーブル
ID 名前 住所 電話
1 森山 東大阪 06-xxxx…
2 田中 寝屋川 072-yyy….
ユーザテーブル
テーブルの関連付け 商品:購入者
商品 1 に対して購入者は複数 かつ購入者 1 に対して商品も複数 ⇒ 多対多
関連するテーブルを扱うアプリ 関連付けの方法
1 対 1 、 1 対多 外部キーを用いる
多対多 関係テーブルを用いる
関連するテーブルを扱うアプリ 外部キー
別のテーブルの主キー( ID )
ID 商品名 値段 カテゴリ
会社 ID
1 アイス(苺) 300 食物 1
2 ジャケット(赤)
4,000 衣類 1
3 スプーン 1,000 食器 2
4 花 500 花 1
5 カバン 10,000
雑貨 2
商品テーブル
ID 社名 住所 電話
1 CHN 東大阪 06-xxxx…
2 田中店 寝屋川 072-yyy….
会社テーブル
関連するテーブルを扱うアプリ 関係テーブル
テーブル間の関係を記録したテーブルID 商品名 値段 カテゴ
リ1 アイス(苺) 300 食物2 ジャケット
(赤)4,000 衣類
3 スプーン 1,000 食器4 花 500 花5 カバン 10,00
0雑貨
ID 名前 住所 電話1 森山 東大阪 06-xxxx…
2 田中 寝屋川 072-yyy….
ID 商品 ID ユーザ ID
1 1 1
2 1 2
3 2 1
4 3 2
5 4 1
6 5 1
7 5 2
関連テーブル
関連するテーブルを扱うアプリ 商品を管理するアプリケーション
1 対 1 アプリケーション( Product, Barcode )
1 対多アプリケーション( Product, Maker )
多対多アプリケーション( Product, User )
関連するテーブルを扱うアプリ 商品を管理するアプリケーション
1 対 1 アプリケーション Product (商品)テーブル
商品名 ⇒ Name : String 値段 ⇒ Price : Integer カテゴリ ⇒ Category : String
Barcode (バーコード)テーブル 番号 ⇒ Code : String
関連するテーブルを扱うアプリ 商品を管理するアプリケーション
1 対 1 アプリケーション1. Product テーブルで Scaffold2. Barcode テーブルで Scaffold3. 関連性を記述4. 確認
関連するテーブルを扱うアプリ 商品を管理するアプリケーション
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 」 外部キーを持たないモデル(今回は Barcod
e )に「 has_one :product 」
関連するテーブルを扱うアプリ 商品を管理するアプリケーション
1 対 1 アプリケーション4. 確認
new.html.erb に<%= text_field :barcode, :code %>
product_controller.rb の create メソッドに@barcode = Barcode.new(params[:barcode])@product.barcode = @[email protected] を@product.save &&@barcode.save
show.html.erb に <%= @product.barcode.code %>
関連するテーブルを扱うアプリ メソッド補足
has_one 1 対 1 の関係 指定したモデルが、このモデルの子であることを宣言 子は一つしか持てない 引数は単数形 (ex. has_one :product)
has_many 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. Maker テーブルで Scaffold2. 関連性を記述3. 確認
関連するテーブルを扱うアプリ 商品を管理するアプリケーション
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 (商品)テーブル
商品名 ⇒ Name : String 値段 ⇒ Price : Integer カテゴリ ⇒ Category : String
User (顧客)テーブル 名前 ⇒ Name : String 住所 ⇒ Address : String 電話番号 ⇒ Telephone : String
History (購入履歴)テーブル 商品 ID ⇒ product_id 顧客 ID ⇒ user_id
関連するテーブルを扱うアプリ 商品を管理するアプリケーション
多対多アプリケーション1. User テーブルで Scaffold2. History テーブルで Scaffold3. データベース更新( db:migrate )4. 関連性を記述5. 確認
関連するテーブルを扱うアプリ 商品を管理するアプリケーション
多対多アプリケーション4. 関連性を記述
各モデルに関連を追加 Product.rb に
has_many :historieshas_many :users, :through => :histories を追加
User.rb にhas_many :historieshas_many :products, :through => :histories を追加
History.rb にbelongs_to :productbelongs_to :user を追加
関連するテーブルを扱うアプリ 商品を管理するアプリケーション
多対多アプリケーション5. 確認
user をいくつかいれる 商品を売る uru メソッドを作成 show.html.erb で表示
総合練習 自分の役に立つアプリケーションを組
んで下さい
以上です お疲れ様でした!
Plugin について Rails プラグイン
他の人が作った便利な追加機能 Rails では、 script/plugin で扱うことがで
きる