第6章の復習メモです。
個人的に重要と思ったことを書きます。
調べたことや、知っていたことも含めて書きます。
モデル
モデルとは
データベースに対して、CRUD操作を行うクラスのこと。
SQLを使わず、Rubyが提供するメソッドを用いて、DB操作できる。
モデルの生成
generate model
コマンドで、モデルを生成できる。
$ rails generate model User name:string email:string
この場合、Userモデルを生成し、
string型のnameカラム、emailカラムを同時に生成している。
モデル名の頭文字は大文字とし、単数形とする慣習がある。
(コントローラの場合、複数形を使う慣習がある。)
DBへの反映
generate model
を実行しただけでは、モデルがDBに反映されていない。
migrationファイルを適用する必要がある。
migrationファイルは、generate model
コマンド実行時に生成される。
マイグレーションファイル
class CreateUsers < ActiveRecord::Migration[5.0]
def change
create_table :users do |t|
t.string :name
t.string :email
t.timestamps
end
end
end
この場合、DBにusersテーブルを作成し、
string型のnameとemailカラム、timestampsカラムを作成する。
主キー(id)は、ここには書かれていないが、自動生成される。
DBに反映するには、以下のコマンドを実行する。
$ rails db:migrate
反映を取り消したい場合、以下のコマンドを実行する。
$ rails db:rollback
モデルのメソッド
最初に書いた通り、SQLを使わず、RubyのメソッドでDB操作できる。
行の作成
user = User.new(name: "Michael Hartl", email: "mhartl@example.com")
※DBにInsertするには、後述のuser.saveが必要
検索
user = User.find_by(email: "mhartl@example.com")
この場合、emailカラムを検索条件としている
はじめの一行を抽出
user = User.first
全行抽出
user = User.all
更新
user.email = "foo@bar.com"
※DBをUpdateするには、後述のuser.saveが必要
保存(DBに反映)
user.save
保存に成功すればtrueを、失敗すればfalseを返す。
削除(DBからDelete)
user.destroy
バリデーション
モデルクラスに、validatesメソッドを記述することで、
バリデーションを実装できる。
存在チェック
validatesメソッドに、presenceという引数を与えて使う。
class User < ApplicationRecord
validates :name, presence: true
end
この場合、nameカラムの存在チェックを実装している。
長さチェック
validatesメソッドに、lengthという引数を与えて使う。
class User < ApplicationRecord
validates :name, presence: true, length: { maximum: 50 }
end
この場合、nameカラムの最大文字数を、50文字に設定している。
フォーマットチェック
validatesメソッドに、formatという引数を与えて使う。
class User < ApplicationRecord
validates :name, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, length: { maximum: 255 },
format: { with: VALID_EMAIL_REGEX } # ← フォーマットチェック
end
この場合、emailカラムについて、VALID_EMAIL_REGEXという変数に
代入したフォーマットに当てはまるかどうか、チェックしている。
一意性チェック
validatesメソッドに、uniquenessという引数を与えて使う。
class User < ApplicationRecord
validates :name, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, length: { maximum: 255 },
format: { with: VALID_EMAIL_REGEX },
uniqueness: true # ← 一意性チェック
end
この場合、emailカラムの一意性をチェックしている。
パスワードのハッシュ化
以下を行うことで、パスワードをハッシュ化し、DBに登録できる。
- モデルクラスにhas_secure_passwordを実装する
- DBにpassword_digestカラムを追加する
- ハッシュ関数のbcryptをGemfileに追加する
1. モデルクラスにhas_secure_passwordを実装する
class User < ApplicationRecord
.
.
.
has_secure_password # ← これを追加する
end
2. DBにpassword_digestカラムを追加する
generate migration
コマンドでmigrationファイルを作成し、
カラムを追加する。
3. ハッシュ関数のbcryptをGemfileに追加する
gem 'rails', '5.1.6'
gem 'bcrypt', '3.1.12' # ← これを追加する
.
.
.
その他
テストについて、詳しめに解説されていますが、
長くなりそうなので、復習メモでは触れないでおきます。