JavaからのRuby on Rails入門

モデル(Model)の作り方について

calendar

reload

データベースとの橋渡し役

 Railsにおけるモデルとは、簡単に言うとデータベースにアクセスする為の機能を持ったクラス(オブジェクト)のことを言います。

 コントローラーの命令に従って、データベースから何らかの情報を取り出したり、あるいはデータベースに何らかの情報を書き込んだりするのがモデルの主な仕事です。

 モデルの仕組みを理解するために、前々回作り始めた電話帳アプリにデータベースを実装してみたいと思います。

 データベースには、membersテーブルを1つ作って以下の情報を保持させます。

  • 名前
  • よみがな
  • 電話番号

 これらの情報をmembersテーブルに書き込む、あるいはそこから取り出して表示することで、電話帳として機能させます。

 membersテーブルはこんな感じです。↓

membersテーブル
id name yomi phone
1 本田圭佑 ホンダケイスケ 01011112222
2 香川真司 カガワシンジ 01022223333
3 長友佑都 ナガトモユウト 01033334444

 普通はデータベースを触るにはSQL文を書く必要がありますが、Railsではモデルがその仕事を一手に引き受けてくれます。

 モデルは、オブジェクト指向言語とリレーショナルデータベースとの橋渡しをするO/Rマッパーという仕組みを内包しているからです。

 O/Rマッパーのおかげでデータベースの各テーブルにおける1つの行を、オブジェクトとして操作することができます。

 そのオブジェクトを作るためのクラスのことをモデルと呼んでいます。

※実際のMemberクラスのソースコードはこんなんじゃありません。あくまでイメージです。

 つまり、開発者が書くのはRubyのみです。あのデリケートかつややこしいSQL文を書かなくていいんです。非常に助かります。

 しかも、モデル(Memberクラス)のソースコードは基本的には自分で書く必要はありません。Railsは面倒なことは全て裏で自動的にしてくれます。驚くべき効率性!

 いやぁそれにしても、Ruby on Railsとは上手いこと言ったもんです。

モデルを作る

 では実際に、membersリソースに関する情報を格納するmembersテーブルと、それを操るためのMemberクラス(モデル)を作ってみましょう。

 membersテーブルとMemberクラスはガッツリ連携するものなので、それぞれ別々に作るのではなく、コンソールでコマンドを叩くことで両方同時に作成します。

注:カレントディレクトリをアプリのルートディレクトリにしておいてください。

cd_phone-book

 モデル作成コマンドはこんな感じです。↓

 モデル名というのは、ここで言うmemberです。コントローラー名が複数形(members)であるのに対し、モデル名は単数形(member)にするのがRailsの規約です。

 このモデル作成コマンドによって、テーブルも作られるわけですが、モデル名をmemberにすると、テーブル名はその複数形であるmembersに勝手になります。
 テーブルには全memberのデータが詰まっているのに対し、基本的にモデルが扱うのはあくまでその中の一人(一行)についてであるという意味で、テーブル名は複数形(members)、モデル名は単数形(member)になります。

 もう一度、モデル作成コマンドを見てみましょう。

 モデル名の後ろには、テーブルに格納したいデータについて入力しています。カラム名:データ型をワンセットにして、スペースを挟んで列挙しています。

 カラム名というのは、もちろんテーブルのカラム名のことで、ここでは、idname(名前)、yomi(読み仮名)、phone(電話番号)に当たります。

membersテーブル
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テーブル)を作ってみましょう。

 コンソールに以下のコマンドを入力してエンターを押してください。

 するとコンソールに、ずらずらっと作成されたファイル名が出力されます。

 5行目のmember.rbが、いわゆるmemberモデル(Memberクラスを定義したファイル)です。
 そして、 4行目の20161206045030_create_members.rbマイグレーションファル(後述)というやつです(数字部分はファイルが作成された日時を表したタイムスタンプなので人によって違います)

 モデルはテーブルの写し鏡みたいなものなので、カラム情報(name:string yomi:string phone:string)を元に、テーブルとモデルを同時に作っているわけですね。

make_model_command

 では出来上がったモデル(member.rb)の中身を見てみましょう。

member_rb

 ご覧のようにMemberクラスの定義部分には何も書かれていません。ですが既に内部的にmembersテーブルと連携して動ける状態になっています。おそらく親クラスであるActiveRecord::Base(ApplicationRecordクラスの親クラス)が、いろいろ裏で取り計らってくれているんだと思います(あえて深入りしないでおきましょう)。
※モデルの継承関係はRails 5より変更されています。

 さて、とりあえずmembersテーブルと連動したmemberモデルを作ったわけですが、実は、モデル作成コマンドを打つだけでは、テーブル自体は作られていません。その設計図であるマイグレーションファイルが作られただけです。

 次は、マイグレーションファイルについて説明します。

この記事をシェアする

コメント

コメントはありません。

down コメントを残す




関連記事

書いている人

Nobuo

Nobuo

一番かんたんなJava入門というサイトを運営しています。Javaやphpは少し分かりますが、Ruby on Railsについては全く何も知らないので、このサイトにアウトプットしながら覚えていこうかと思っています。 [詳細]

folder Rubyの基本文法

more...

folder 初めてのRuby on Rails入門

more...

folder Rails忘備録

more...