kouの技術的メモ

学習した内容の定着やアウトプット用に開設しました

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メソッドを使うことで、モデルに対してセキュアなパスワードを追加することができる