スポンサーリンク
データベースとの橋渡し役
Railsにおけるモデルとは、簡単に言うとデータベースにアクセスする為の機能を持ったクラス(オブジェクト)のことを言います。
コントローラーの命令に従って、データベースから何らかの情報を取り出したり、あるいはデータベースに何らかの情報を書き込んだりするのがモデルの主な仕事です。
モデルの仕組みを理解するために、前々回作り始めた電話帳アプリにデータベースを実装してみたいと思います。
データベースには、membersテーブルを1つ作って以下の情報を保持させます。
- 名前
- よみがな
- 電話番号
これらの情報をmembersテーブルに書き込む、あるいはそこから取り出して表示することで、電話帳として機能させます。
membersテーブルはこんな感じです。↓
id | name | yomi | phone |
---|---|---|---|
1 | 本田圭佑 | ホンダケイスケ | 01011112222 |
2 | 香川真司 | カガワシンジ | 01022223333 |
3 | 長友佑都 | ナガトモユウト | 01033334444 |
普通はデータベースを触るにはSQL文を書く必要がありますが、Railsではモデルがその仕事を一手に引き受けてくれます。
モデルは、オブジェクト指向言語とリレーショナルデータベースとの橋渡しをするO/Rマッパーという仕組みを内包しているからです。
O/Rマッパーのおかげでデータベースの各テーブルにおける1つの行を、オブジェクトとして操作することができます。
そのオブジェクトを作るためのクラスのことをモデルと呼んでいます。
1 2 3 4 5 6 | class Member @id @name @yomi @phone end |
※実際のMemberクラスのソースコードはこんなんじゃありません。あくまでイメージです。
つまり、開発者が書くのはRubyのみです。あのデリケートかつややこしいSQL文を書かなくていいんです。非常に助かります。
しかも、モデル(Memberクラス)のソースコードは基本的には自分で書く必要はありません。Railsは面倒なことは全て裏で自動的にしてくれます。驚くべき効率性!
いやぁそれにしても、Ruby on Railsとは上手いこと言ったもんです。
スポンサーリンク
モデルを作る
では実際に、membersリソースに関する情報を格納するmembersテーブルと、それを操るためのMemberクラス(モデル)を作ってみましょう。
membersテーブルとMemberクラスはガッツリ連携するものなので、それぞれ別々に作るのではなく、コンソールでコマンドを叩くことで両方同時に作成します。
注:カレントディレクトリをアプリのルートディレクトリにしておいてください。
モデル作成コマンドはこんな感じです。↓
1 | $rails g model モデル名 カラム名:データ型 カラム名:データ型 ・・・ |
モデル名というのは、ここで言うmemberです。コントローラー名が複数形(members)であるのに対し、モデル名は単数形(member)にするのがRailsの規約です。
このモデル作成コマンドによって、テーブルも作られるわけですが、モデル名をmemberにすると、テーブル名はその複数形であるmembersに勝手になります。
テーブルには全memberのデータが詰まっているのに対し、基本的にモデルが扱うのはあくまでその中の一人(一行)についてであるという意味で、テーブル名は複数形(members)、モデル名は単数形(member)になります。
もう一度、モデル作成コマンドを見てみましょう。
1 | $rails g model モデル名 カラム名:データ型 カラム名:データ型 ・・・ |
モデル名の後ろには、テーブルに格納したいデータについて入力しています。カラム名:データ型をワンセットにして、スペースを挟んで列挙しています。
カラム名というのは、もちろんテーブルのカラム名のことで、ここでは、id、name(名前)、yomi(読み仮名)、phone(電話番号)に当たります。
id | name | yomi | phone |
---|---|---|---|
1 | 本田圭佑 | ホンダケイスケ | 01011112222 |
2 | 香川真司 | カガワシンジ | 01022223333 |
3 | 長友佑都 | ナガトモユウト | 01033334444 |
idのカラムは自動的に作られるので、モデルを作成する際、自分でコマンドで書く必要はありません。というか書いてはいけません。
データ型というのは、テーブルに格納する値の種類のことです。
主なデータ型
- string・・・短めの文字列(半角255文字以内)
- text・・・長めの文字列(半角65535文字以内)
- integer・・・整数値
- float・・・小数値
- boolean・・・真偽値
ここではnameもyomiもphoneも全てstringで作ります。
電話番号は数字だからと言ってintegerにしないように。integerはただの数字ではなく数値です。電話番号ってのは数値ではなくただの数字の羅列です。
では実際にコマンドを叩いて、memberモデル(及びmembersテーブル)を作ってみましょう。
コンソールに以下のコマンドを入力してエンターを押してください。
1 | $ rails g model member name:string yomi:string phone:string |
するとコンソールに、ずらずらっと作成されたファイル名が出力されます。
1 2 3 4 5 6 7 8 | Running via Spring preloader in process 26120 Expected string default value for '--jbuilder'; got true (boolean) invoke active_record create db/migrate/20161206045030_create_members.rb create app/models/member.rb invoke test_unit create test/models/member_test.rb create test/fixtures/members.yml |
5行目のmember.rbが、いわゆるmemberモデル(Memberクラスを定義したファイル)です。
そして、 4行目の20161206045030_create_members.rbがマイグレーションファル(後述)というやつです(数字部分はファイルが作成された日時を表したタイムスタンプなので人によって違います)。
モデルはテーブルの写し鏡みたいなものなので、カラム情報(name:string yomi:string phone:string)を元に、テーブルとモデルを同時に作っているわけですね。
では出来上がったモデル(member.rb)の中身を見てみましょう。
1 2 | class Member < ApplicationRecord end |
ご覧のようにMemberクラスの定義部分には何も書かれていません。ですが既に内部的にmembersテーブルと連携して動ける状態になっています。おそらく親クラスであるActiveRecord::Base(ApplicationRecordクラスの親クラス)が、いろいろ裏で取り計らってくれているんだと思います(あえて深入りしないでおきましょう)。
※モデルの継承関係はRails 5より変更されています。
さて、とりあえずmembersテーブルと連動したmemberモデルを作ったわけですが、実は、モデル作成コマンドを打つだけでは、テーブル自体は作られていません。その設計図であるマイグレーションファイルが作られただけです。
次は、マイグレーションファイルについて説明します。