エンジニア志望のブログ

Railsチュートリアル第6章

はじめに
Ruby on Railsチュートリアル(第6版)のメモ、演習の解答例を記述した記事です。
解答は個人のものなので、誤りがあればご指摘ください。
開発環境  Ruby: 2.7.2 , Rails: 6.1.4

メモ

Active Record

データベースとやり取りをするデフォルトのライブラリ
このライブラリのおかげで直接SQL文を書かずにRailsのメソッドでデータベースを操作できる。
(O/Rマッピング)
Active Recordはデータオブジェクトの作成、保存、検索のためのメソッドを持っている。

マイグレーション

ActiveRecordの機能のひとつ
マイグレーションRubyを記述することでテーブルの作成、変更を行うことができる。
マイグレーションを実行することを「マイグレーションの適用」と呼ぶ。

$ rails db:migrate

スキーマ

データベースの構造を追跡するために使われる。
db/schema.rb

コンソール(サンドボックスモード)

データベースを変更したくないときに使う

$ rails console --sandbox

モデル

モデルの生成

$ rails generate model モデル名(単数形)

作成したモデルはApplicationRecordを継承している。
ApplicationRecordはActive Recordを継承している。
つまり生成したモデルはActive Recordのメソッドが使える

CRUD

データベースの操作を表す「Create」、「Read」、「Update」、「Delete」の頭文字。
Active RecordはCRUDのメソッドを生成するのでActive Recordを継承したモデルでもこれらのメソッドを利用できる。
 例:user.new, user.find, user.update, user.destroy ...
 update_attributeメソッドは検証を回避して更新することができる
参考:Active Record の基礎 - Railsガイド

検証

ActiveRecordでは検証(Validation)という機能でモデルの属性に制約を課すことができる。
 よく使われるバリデーションヘルパー
  ・存在性 (presence)
  ・長さ (length)
  ・フォーマット (format)
  ・一意性 (uniqueness)
  ・確認 (confirmation)
参考:Active Record バリデーション - Railsガイド

有効性の検証

バリデーション機能が正常に動いているかはテストで確かめる

  1. 有効なモデルのオブジェクトを作成
  2. 作成したオブジェクトのうちの1つを有効でない属性に意図的に変更する
  3. バリデーションで失敗するかテストする
  4. テストが成功するようにモデルにバリデーションを設定する
  5. テストが成功するか確認する
一意性の検証

モデルの一意性を検証するときにメモリ上だけでなく実際にレコードをデータベースに登録して検証する必要がある。
テスト上で登録したレコードは"db/test.sqlite3"のテスト用のデータベースに保存される。

  test "email addresses should be unique" do
    duplicate_user = @user.dup      #dupでオブジェクトを複製
    @user.save      #db/test.sqlite3のデータベースに登録
    assert_not duplicate_user.valid?
  end

インデックス

通常テーブルの中から特定のカラムを検索するとき、テーブルの上から下まで探したいカラムを闇雲に探す。
このままだと、数千人、数万人が登録されたデータベースから一人を探すのは時間がかかる、
そこでインデックスを使うと早く検索できるらしい、、

indexを追加する

$ rails generate migration add_index_to_テーブル名_カラム名

生成されたmigrationファイルは以下のようになる。

class AddIndexToテーブル名 < ActiveRecord::Migration
  def change
    add_index :テーブル名, カラム名[, unique: true ]
  end
end

Railsチュートリアルでは"unique: true"を追加して一意性を強制している。
参考:データベースにindexを張る方法 - Qiita

コールバック

オブジェクトの保存、更新、削除の際に処理を実行させる
コールバックを使う際は慎重に、、、
苦しめられてやっと理解できたRailsコールバックの使い方 - KitchHike Tech Blog

reloadメソッド

現在のデータベースと同じ値に更新する。

user = User.new( name: "user", email: "user@example.com" )
=> #<User id: nil, name: "user", email: "user@example.com", created_at: nil, updated_at: nil, password_digest: nil>
user.save
=> true
user.name = "hogehoge"
=> "hogehoge"
user.reload.name
=> "user"

セキュアなパスワード

パスワード、パスワードの確認をユーザーに入力してもらい、そのデータをハッシュ化してデータベースに保存することで安全性を保つ。

ハッシュ化されたパスワードを保存するには
  1. モデルにpassword_digesカラムを追加する
  2. ハッシュ関数を導入する(bcrypt)
  3. モデルでhas_secure_passwordメソッドを呼び出す

has_secure_passwordを呼び出したモデルは以下の機能が使えるようになる
・ハッシュ化したパスワードをpassword_digestに保存できるようになる
・ペアの仮想的な属性であるpasswordとpassword_confirmationが使えるようになる
 存在性とpasswordとpassword_confirmationが一致するかどうかのバリデーションも追加される
・authenticateメソッドが使えるようになる

おわりに

6章ではUserテーブルを作りバリデーションの設定、セキュアなパスワードの追加をしました。

has_secure_passwordの力恐るべしです。