1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

基礎Ruby on Rails Chapter4 データベースとモデル

Last updated at Posted at 2018-09-19

基礎Ruby on Rails Chapter3 レイアウトテンプレート
基礎Ruby on Rails Chapter4 データの保存

データベースの設定

接続の設定

  • DBMSへの接続設定はconfig/database.ymlで行う。
  • rails newコマンドは、DBMSを指定しないとSQLite3用の設定を作る。
config/database.yml
default: &default
  adapter: sqlite3
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

development:
  <<: *default
  database: db/development.sqlite3

test:
  <<: *default
  database: db/test.sqlite3

production:
  <<: *default
  database: db/production.sqlite3

3つのモード

  • 開発 development 開発環境

  • テスト test 自動テストのための環境

  • 本番 production 本番環境

  • database.ymlには、それぞれの環境用の設定が書いてある。

  • config/environmentsディレクトリの下には、3つのモードごとの設定ファイルがある。(develop.rb、test.rb、production.rb)

  • 環境変数によって切り替える。export RAILS_ENV=productionを実行してから、railsコマンドを実行すると、本番モードの下で動く。

データベースの作成

データベースの作成

  • 以下のコマンドで(develop、test環境の)dbを作成する。
  • SQLLite3では自動的にデータベースができるが、MySQLやPostgreSQLでは必須。
$ bin/rails db:create
  • 以下のコマンドで(本番環境の)dbを作成する。
$ bin/rails db:create RAILS_ENV=production
  • 以下のコマンドでdbを削除する。(本番環境ではRAILS_ENV=productionを付ける)
$ bin/rails db:drop

タイムゾーンの設定

config/application.rb(一部)

    # タイムゾーンの設定を追加
    config.time_zone = "Tokyo"
  end
end

モデルの作成

  • モデルを作成するには、bin/rails g model モデル名を実行する。
  • モデル名は複数形にしてはいけない。
  • entry_image、EntryImageとしてもEntryImageモデルができる。テーブル名はentry_images。
$ bin/rails g model member
      invoke  active_record
      create    db/migrate/20180918123930_create_members.rb
      create    app/models/member.rb
model/member.rb
class Member < ApplicationRecord
end

マイグレーション

マイグレーションで、データベースの中にMemberモデルに対応するmembersテーブルを作成する。

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

  • 上記で作成した、db/migrate/20180918123930_create_members.rbがマイグレーションスクリプト。
db/migrate/20180918123930_create_members.rb
class CreateMembers < ActiveRecord::Migration[5.2]
  def change
    create_table :members do |t|

      t.timestamps
    end
  end
end

membersテーブルの作成

上記スクリプトを以下のように修正する。

db/migrate/20180918123930_create_members.rb
class CreateMembers < ActiveRecord::Migration[5.2]
  def change
    create_table :members do |t|
      t.integer :number, null: false  # 背番号
      t.string :name, null: false # ユーザ名
      t.string :full_name # 本名
      t.string :email # メールアドレス
      t.date :birthday  # 生年月日
      t.integer :sex, null: false, default: 1 # 性別(1:男、2:女)
      t.boolean :administrator, null: false, default: false # 管理者フラグ

      t.timestamps
    end
  end
end
  • migrateは、bin/rails db:migrateコマンドを実行すると、開発用のデータベースにテーブルmembersが作成され、カラムか追加される。
  • 本番環境では、bin/rails db:migrate RAILS_ENV=productionを実行する。
$ bin/rails db:migrate
== 20180918123930 CreateMembers: migrating ====================================
-- create_table(:members)
   -> 0.0018s
== 20180918123930 CreateMembers: migrated (0.0024s) ===========================
  • rb:db/schema.rbに、migrateした時点でのデータベースの構造を再現するスクリプトが書き込まれる。
db/schema.rb
ActiveRecord::Schema.define(version: 2018_09_18_123930) do
  create_table "members", force: :cascade do |t|
    t.integer "number", null: false
    t.string "name", null: false
    t.string "full_name"
    t.string "email"
    t.date "birthday"
    t.integer "sex", default: 1, null: false
    t.boolean "administrator", default: false, null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end
end

マイグレーションの詳細

カラムの追加

  • 以下を実行して、マイグレーションスクリプトを作成する。
$ bin/rails g migration AlterMembers
  • 以下のように、add_column :テーブル名, :カラム名, :カラムの型を追記する。
class AlterMembers < ActiveRecord::Migration[5.2]
  def change
    # 以下を追記する。
    add_column :members, :phone, :string
  end
end
  • bin/rails db:migrateを実行すると、新たに、phoneカラムが追加される。

マイグレーションのバージョン

  • マイグレーションスクリプトのファイル名の「年月日時分秒」は、マイグレーションのバージョンを表す。
  • 古いバージョンに戻したい場合は、以下のようにバージョンを指定する。この前に行った変更が打ち消す操作が行われる。
$ bin/rails db:migrate VERSION=20180523132805
  • マイグレーションのバージョンは、データベースのschema_migrationsテーブルで管理されている。
  • schema_migrationsテーブルは、bin/rails db:migrateコマンドを実行すると自動的に作られる。
  • bin/rails db:migrate:statusコマンドを実行すると、現在のマイグレーションのバージョンを確認できる。upが付いているのが現在のマイグレーション。
$ bin/rails db:migrate:status

database: /mnt/c/Users/tseno/Desktop/rails/asagao/db/development.sqlite3

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20180918123930  Create members
  • データベース定義を古い定義に戻すには、bin/rails db:rollbackコマンドも使える。
  • 以下はマイグレーションを1つだけ取り消す。(ロールバック)
$ bin/rails db:rollback
  • 以下はマイグレーションを3つ戻す。STEPオプションを使う。
$ bin/rails db:rollback STEP=3

カラムの変更と削除

  • マイグレーション用メソッド

    • add_column(テーブル名,カラム名,型,オプション) カラムの追加
    • rename_column(テーブル名,カラム名,新しい名前) カラム名の変更
    • change_column(テーブル名,カラム名,型,オプション) カラムの型の変更
    • remove_column(テーブル名,カラム名) カラムの削除
  • 以下はnameカラムを、nicknameに名前を変更する例。

class AlterMembers < ActiveRecord::Migration
  def change
    rename_column :members, :name, :nickname
  end
end
  • change_columnと、remove_columnは、changeメソッド内で使用すると、ロールバックできない。
    • upメソッドに、マイグレーションを進める処理を書く。
    • downメソッドに、取り消す処理を描く。
class AlterMembers < ActiveRecord::Migration
  def up
    rename_column :members, :name, :nickname
    change_column :members, :sex, :integer, null: false, default:2
  end

  def down
    change_column :members, :sex, :integer, null: false, default:1
    rename_column :members, :nickname, :name
  end
end

インデックス

  • インデックスの作成。add_index :テーブル名, :カラム名, オプション
  • マイグレーションスクリプト、change、up、downメソッドで使用できる。
  • add_indexオプション
    • unique: 重複禁止
    • name: インデックス名(省略すると、テーブル名_カラム名_indexとなる)
add_index :members, :name, unique: true, name: 'name_index'
  • インデックスの削除。columnオプションでカラム名を指定するか、nameオプションでインデックス名を指定する。
remove_index :members, column: 'name'
remove_index :members, name: 'name_index'

開発中と本番でのマイグレーション

開発中にテーブル定義を変更する方法としては以下の2通りがある。

  • 新しいマイグレーションスクリプトを追加し、マイグレーションを行う。
    • 本番稼働中など、データベースの破棄ができない場合
  • 既存のマイグレーションスクリプトを書き換え、マイグレーションを最初からやり直す。
    • マイグレーションを最初からやり直すには、bin/rails db:migrate:resetコマンドを使う。
$ bin/rails db:migrate:reset

参考
改訂4版 基礎 Ruby on Rails (IMPRESS KISO SERIES)

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?