基礎RubyOnRails Chapter4 データベースとモデル
基礎RubyOnRails、今回はデータベース回です。
データベースについての詳細はSQL基礎から始めるデータベース
でやっているので、
Railsのデータベースとモデルの関連部分について勉強していきます。
stonebeach-dakar.hatenablog.com
改訂3版基礎 Ruby on Rails (KS IMPRESS KISO SERIES)
- 作者: 黒田努,佐藤和人,株式会社オイアクス
- 出版社/メーカー: インプレス
- 発売日: 2015/05/22
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る
はじめに
◯◯はモデル名、コントローラ名と思ってください。
モデルとは?
MVCモデルのM,データを表現するものです。
RailsではActiveRecord::Base
を継承したクラス、そしてそれに対応するDBMSのテーブルを1まとめにしてモデルと呼ばれます。
イメージをみて分かる通り、モデルクラスとテーブルは基本的に1体1の関係となっています。
モデルの作成
Railsでは、モデルクラスの作成はそのままファイルを新規作成して、ActiveRecord::Base
を継承して作成することもできますが、
rails generate
を使うことで楽に作成できます。
ここで、モデル名はRailsの制約通り単数形
にするように注意してください。
$rails g model ◯◯ invoke active_record create db/migrate/20xxxxxxxxxx_create_◯◯s.rb(複数形になります) create app/models/◯◯.rb
こうすることで、モデルクラスだけではなく対応するテーブルを作成するマイグレーションスクリプト
の雛形もRailsが作ってくれます。
ただし、DBが未作成だとすぐにマイグレーションはできません。
モデルクラスのインスタンス
モデルクラスのインスタンスは、テーブルの1つのレコードを表現するものになります。
たとえば、Userというモデルクラスがあれば、ユーザー1人分の名前、メールアドレス等を持つものがモデルクラスののインスタンスです。
従って、複数のレコードを持つものはモデルクラスではなく、複数のモデルのインスタンスを持つ配列
というイメージです。
(実際には、配列というよりはSQL文そのものという感じ。)
DBMSの操作
DBの作成
RailsのデフォルトDBMSとなっているSQLite
を使う場合、rails new
で新しいアプリケーションを作成した時に自動的にDBが作成されます。
MySQL
, PostgreSQL
等、他のDBMSを使う場合はコマンドを打って作成する必要があります。
$rake db:create
ちなみに、デフォルトの状態だとdevelopment
環境のdbが作成され、production
環境のdbは作成されません。
そのため、開発環境で問題なくとも本番環境で動かした時にアレ!?っとなります。
なので、自分の場合開発環境のdbをcreateするときは一緒に本番環境のdbも作ってしまいます。
本番環境のdbの作成方法は以下のとおり。
$rake db:create RAILS_ENV=production
RAILS_ENV
とはRailsの環境変数で、この環境変数の値によってRailsが本番環境、テスト環境、開発環境を使い分けます。
db系の操作だけではなく、サーバー起動時にもこの環境変数が関係します。
DBの削除
dbを削除して、再作成したい場合は、 以下のコマンドを使います。
$rails db:drop
ただし、dbの削除をするときはたいてい再マイグレーションをするので、rake db:reset
やrake db:migrate:reset
を使うことがほとんどです。
'
DBクライアントを使う
SQLite
,MySQL
等各DBMSのCUIクライアントを使う場合、それぞれのクライアント起動コマンドを使っても良いのですが、Railsのアプリケーションディレクトリにいる場合は以下のコマンドからクライアントを起動できます。
$rails db
ちょこっとデータ確認などには便利です。
マイグレーションとは?
RailsでDBMSのテーブルを追加・編集・削除等の操作を行う機能。
実際のDBMSを操作するのではなく、スクリプトファイルを作成してそれを実行することでDBMSを変更するという形式になっています。
ソースコードのバージョン管理システムに近いバージョン管理機能
を持つため、いつでも任意のバージョンに戻したり、多くの変更を一度に反映させることができます。
また、各DBMSのSQLの違い(方言)
を気にしなくていいので、SQLを覚えなくてもいい。らくちん。
(でも標準操作やCRUDくらいは確認しておこうね)
マイグレーションのバージョン
マイグレーションスクリプトファイルは、作成時にファイル名に自動的にタイムスタンプ
が付与される。
たとえば、2016年1月1日にマイグレーションスクリプトを作成した場合、20160101xxxxxx
(xxxxの部分は重複しないユニークな値)となる。
このタイムスタンプが、バージョン名となります。
マイグレーションスクリプトの作成
モデルクラスの作成時rails g model ◯◯
で作成した場合は、自動的にマイグレーションスクリプトが作成されます。
それ以外、例えばテーブルの列名の変更などを行うときは、以下のコマンドでマイグレーションスクリプトが作成できます。
$rails g migration ◯◯ invoke active_record create db/migrate/20xxxxxxxxxxx_◯◯.rb
実行結果を見ても分かる通り、20xxxxxx_◯◯.rb
というマイグレーションスクリプトがdb/migrate
ディレクトリに作成されます。
あとは編集して実行するだけ。
マイグレーションスクリプトの編集
作成したばかりのマイグレーションスクリプトは、以下の用になっています。
( これはモデルクラスを新規作成した時に生成されるマイグレーションスクリプトです。)
class CreateStaffs < ActiveRecord::Migration def change create_table :staffs do |t| t.timestamps null: false end end end
このスクリプトにテーブルのカラム名と制限やデフォルト値等を設定し、テーブルを作成することになります。
例えば、以下の様な感じです。
def change create_table :staffs do |t| t.string :name, null: false t.string :mail_address, null: false t.integer :age t.integer :gender, null: false, default: 0 t.timestamps null: false end end
上記の例の場合、name,mail_address,age,genderというカラム、そして自動的に作られるid
カラム、t.timestamps
によってcreated_at,updated_atという2つのカラムが作成されます。
null:false
オプションがあるカラムはNOT NULL制約がかかり、defaultオプションが有るgenderカラムは初期値が0に設定されます。
マイグレーションスクリプトの実行
以下のコマンドを実行することで、未実行のマイグレーションスクリプトが全て実行され、DBMSにマイグレーションスクリプトの操作の結果が反映されます。
これも、RAILS_ENV
の影響を受けるため、production環境に変更を反映させる場合、引数にRAILS_ENV=production
を追加してください。
$ rake db:migrate
マイグレーションスクリプトの修正
前回の記事を参考にしてください。