読者です 読者をやめる 読者になる 読者になる

Blank?=False

「呉下の阿蒙にあらず」をモットーにしたITエンジニアの日々

基礎RubyOnRails Chapter4 データベースとモデル

Rails 読書

f:id:stonebeach-dakar:20160618082625p:plain

基礎RubyOnRails、今回はデータベース回です。
データベースについての詳細はSQL基礎から始めるデータベースでやっているので、
Railsのデータベースとモデルの関連部分について勉強していきます。

stonebeach-dakar.hatenablog.com

改訂3版基礎 Ruby on Rails (KS IMPRESS KISO SERIES)

改訂3版基礎 Ruby on Rails (KS IMPRESS KISO SERIES)

はじめに

◯◯はモデル名、コントローラ名と思ってください。

モデルとは?

MVCモデルのM,データを表現するものです。
RailsではActiveRecord::Baseを継承したクラス、そしてそれに対応するDBMSのテーブルを1まとめにしてモデルと呼ばれます。
f:id:stonebeach-dakar:20160623194044p:plain

イメージをみて分かる通り、モデルクラスとテーブルは基本的に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:resetrake db:migrate:resetを使うことがほとんどです。
'

DBクライアントを使う

SQLite,MySQL等各DBMSCUIクライアントを使う場合、それぞれのクライアント起動コマンドを使っても良いのですが、Railsのアプリケーションディレクトリにいる場合は以下のコマンドからクライアントを起動できます。

$rails db

ちょこっとデータ確認などには便利です。

マイグレーションとは?

RailsDBMSのテーブルを追加・編集・削除等の操作を行う機能。
実際のDBMSを操作するのではなく、スクリプトファイルを作成してそれを実行することでDBMSを変更するという形式になっています。
ソースコードバージョン管理システムに近いバージョン管理機能を持つため、いつでも任意のバージョンに戻したり、多くの変更を一度に反映させることができます。

また、各DBMSSQLの違い(方言) を気にしなくていいので、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

マイグレーションスクリプトの修正

前回の記事を参考にしてください。

stonebeach-dakar.hatenablog.com