感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

Railsでモデルを作成してみる。

スポンサーリンク

モデルとは

モデルとは、データベースや外部サービスへのアクセスなど、データの管理/操作を担当するコンポーネントのことです。

なるほど。DAOとかBeanとか、Javaでは見てきたけれど、それと関係あるかな。
読み進める。

O/Rマッパー(Object/Relational Mapper)とは、リレーショナルデータベースとオブジェクト指向言語の橋渡しを受け持つライブラリのこと。
これだけじゃよくわからないので、さらに読み進める。

インピーダンスミスマッチとは、アプリケーションとデータベースの構造的なギャップのこと。
テーブルから取得した結果を手動でオブジェクトのプロパティに割り当てたり、DBに登録する値をオブジェクトからひとつひとつ取り出したり。
たしかに、HogeBeanに値をつっこんだり、取り出したりしながら、DBに格納してたっけ。

さらに、読み進める。

このインピーダンスミスマッチを解消するために、O/Rマッパーは存在する。

O/RマッパーであるActive Recordを利用すると、Railsではリレーショナル・データベースをあたかもオブジェクトであるかのように操作できるらしい。
本の図がわかりやすいんだけど、さすがに載せられない。

database.yml

YAMLは「パラメータ:値」の形式でパラメータを表す。
database.ymlはconfig以下にある。

adapterは接続するデータベースの種類
databaseはデータベース名
hostはホスト名やIPアドレス
portはポート番号
poolは確保する接続プール
timeoutは接続タイムアウト時間
encodingは使用する文字コード
usernameはユーザー名
passwordはパスワード
などなど。

モデルクラスを作成する方法

以下のコマンドでモデルクラスを作成できる。

rails generate model [モデルクラスの名前] [フィールド名:データ型] [フィールド名:データ型]・・・

具体的にはこんな感じ。

>rails generate model staff name:string age:integer departm
ent:string
      invoke  active_record
      create    db/migrate/20130811045400_create_staffs.rb
      create    app/models/staff.rb
      invoke    test_unit
      create      test/models/staff_test.rb
      create      test/fixtures/staffs.yml

マイグレーションファイル

Railsではデータベースの作成(テーブルの作成)もコマンドで行うことができる!
これはすごくいい。
マイグレーションというテーブルレイアウトを作成/変更する仕組みを使って、テーブル作成を自動化する。

rake db:migrate

のコマンドで、マイグレーションファイルに基いてテーブルを作成してくれるらしい。

C:\railsdata\railbook>rake db:migrate
==  CreateStaffs: migrating ===================================================
-- create_table(:staffs)
   -> 0.0220s
==  CreateStaffs: migrated (0.0240s) ==========================================

ちなみに、勝手に「id」カラムを作ると、こんな感じで怒られるので注意が必要。

you can't redefine the primary key column 'id'. To define a custom primary key,
pass { id: false } to create_table.

で、実際にテーブルができているか確認すると・・・

>rails dbconsole
SQLite version 3.7.15.2 2013-01-09 11:53:05
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>
sqlite> .schema staff
sqlite> .schema staffs
CREATE TABLE "staffs" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" v
archar(255), "age" integer, "department" varchar(255), "created_at" datetime, "u
pdated_at" datetime);

たしかにテーブルができている。
IDが自動で付与されるんだね。


コントローラクラスに以下のように記述する。
hello_controller.rb

# coding: utf-8

class HelloController < ApplicationController
	def staff_list
		@staffs = Staff.all
	end
end

ここのstaff_listというメソッドは、後にURLに対応する。
要は、こんな感じでリクエストを飛ばすんだけど、staff_listというメソッドはURLに対応している。

http://localhost:3000/hello/staff_list

これは、helloというコントローラのstaff_listというメソッドに対応するという意味。

では、staff_listメソッドに対応するviewを。
「staff_list.html.erb」
という名前で作成する。

<table border="1">
	<tr>
		<th>名前</th><th>年齢</th><th>部署</th>
	</tr>
<% @staffs.each do |staff| %>
	<tr>
		<td><%= staff.name %></td>
		<td><%= staff.age %></td>
		<td><%= staff.department %></td>
	</tr>
<% end %>
</table>

コントローラで定義された@staffs変数を共有している。
で、staffsからstaffオブジェクトを取り出して、表示している。

リクエストを飛ばすと

http://localhost:3000/hello/staff_list

ブラウザにはテーブルが表示される。

勉強した本

Ruby on Rails 3 アプリケーションプログラミング

Ruby on Rails 3 アプリケーションプログラミング


本のサンプルを動かして、その後に実際に自分なりに真似してやってみると、けっこう色んな所でハマる。
だがそれがとても勉強になった。やっぱり自分でやってみるって大事。

感謝のプログラミング

今回で感謝のプログラミングは【581時間目】
10000時間まで、あと【9419時間】