Railsチュートリアル6章 ユーザーのモデルを作成する
今回はモデル作成回です。
RailsではActiveRecordというRailsライブラリとマイグレーション機能によって、RDBから切り離されているため、SQL言語を使う必要がない。
モデルの作成方法
rails generate model モデル名 カラム名:データ型 カラム名:データ型.... モデル名は最初の文字は大文字。データ型はintegerやstring等。 例 rails generate model User name:string email:string この場合モデル名はUser。テーブル名はusersとなる。
この結果モデルとマイグレーションファイルが生成されます。
マイグレーションファイルはデータベースを操作するときに使うもので、カラムの追加や削除時に新しく作っていく。
作成時の日時がマイグレーションファイルのファイル名になるのですが、これは複数の作業者で作っていく際、同名のファイルを避けてコンフリクトを防ぐため。
マイグレーションファイル単体での作成(カラムを追加したり削除したりする場合)は 例 rails generate migration マイグレーションファイル名 カラム名:strings マイグレーションファイル名は作成の目的がわかる名前にする。
モデルを作成したら次にマイグレーション
以下でマイグレーションをし、反映させる
rails db:migrate
モデルの検索
モデル名.find(Id番号) 例 User.find(1)
で、情報を取得できる
ID以外の属性で検索したい場合
例User.find_by(email: "mhartl@example.com") find_byを使う
例 User.first を使うと一番最初のユーザーを検索できる=User.find(1)と同じ効果
例 User.all でデータベースのすべてのUserオブジェクトが返ってくる。
DBの内容の制限
validates によって、保存内容を宣言することができる
モデルのテスト
以下のコマンド rails test:models
testにおいてvalidメソッドを使うが、 valid?メソッドは、そのオブジェクトが有効かどうかを判定する(trueかfalseを返す) user.valid? また、assert_notは、含まれていなければ、true、含まれていればfalseを返す。
一意性の確保
ActiveRecordはデータベースのレベルでは一意性(同じものが二つと無い状態)を100%は確保できない。 よって、一意性を100%確保したい場合はそのカラムにIndexを張り、そのindexにunique: true
パスワードのハッシュ化
パスワードを平文でDB1に保存すると危険なので、ハッシュ化した上で保存する必要がある。
bcryptをgemに追加し、password_digestカラムをDBに追加し、Userモデル内でhas_secure_password機能使うことによって、ハッシュ化できる。
gem追加時にはbundleinstallを忘れずに。
6章の重点
モデルの作成
モデルの実態はdb/development.sqliteでCloud9環境では右クリックダウンロードし、DB.Browserで内容を確認できる。
モデルオブジェクト(データベースの中身)の生成
- まずモデル名.new 例 user = User.new(name: "田中", email: "tanaka@test.co.jp")
- 次にモデルの保存 モデル名.save 例 user.save
- モデル名.createでnewとsaveメソッドを一度に実行することも可能。例 User.create
- emailは正規表現で入力形式に制限をかける
- データベースにインデックスを追加することで検索効率が向上する。また、データベースレベルでの一意性を保証するためにも使われる
- has_secure_passwordメソッドを使うことで、モデルに対してセキュアなパスワードを追加することができる