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で扱うことができる
© Copyright 2024 ExpyDoc