【Rails】モデルとvalidateについて_Railsチュートリアル6章より

Rails tutorialの第6章を終えました。 その時の気づいたこととか備忘録を何部かに分けて。 今回はモデル作成について

railstutorial.jp

model作成

以下のDBに対して、やり取りを行うUserモデルを作成します。

Usersテーブル

カラム
name String
email String

マイグレ

マイグレーションファイル作成

上記テーブルを作成するために、モデルを作成していきます。

$ rails generate model User name:string email:string

上記コマンドの結果、マイグレーションと呼ばれる新しいファイルがdb/migrateに自動で生成されます。

db/migrate/[timestamp]_create_users.rb

class CreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users do |t|
      t.string :name
      t.string :email

      t.timestamps #create_atとupdate_atという作成日時と更新日時を管理するカラムを作成
    end
  end
end

マイグレーションは、データベースの構造をインクリメンタルに変更する手段を提供します。
それにより、要求が変更された場合にデータモデルを適合させることができます。

またマイグレの追跡はこれまた自動で作成及び更新を行うdb/schema.rbで行います。

マイグレーションの適用

マイグレーションの適用 (migrating up) をするときは
db:migrateコマンド を使って実行することができます。

$ rails db:migrate

rollback

また戻すときはrollbackです

$ rails db:rollback

DBの操作

$db:migrateが実行されると、db/development.sqlite3という名前のファイルが生成されます。 これはSQLite5データベースの実体です。

このDBを操作するためには下記コマンドで行えます。

$ rails db

詳細は下記の詳細が詳しいです。

qiita.com

Railsコンソールを使ってデータモデルをサンドボックスモードで調べます(サンドボックスモードを使うと、データベースへの変更をコンソールの終了時にすべて “ロールバック” (取り消し) してくれます。)

$ rails console --sandbox

ユーザーオブジェクトの操作

作成したデータモデルを操作してみます
操作する際のメソッドをまとめてみます
これらのメソッドはテストコードでも使用できます。

メソッド 操作
.new オブジェクトを作成します
save オブジェクトをDBに保存します
.create 初期値設定と保存を同時に行います
.destroy 削除と保存を同時に行います
.valid? オブジェクトが有効かどうかを検証します。
true,falseで返却されます
.find_by オブジェクトを検索します。
find_by(hoge: "piyo")でhogeカラムのpiyoレコードを検索します
.first オブジェクトの最初のカラムを検索します
.all オブジェクトの全てのカラムを検索します
. update_attributes オブジェクトのカラムを更新します。(※1)(※2)
. update_attribute オブジェクトのカラムを更新します。(※2)

※1 更新についてはhoge.piyo="huga"とカラムに対して直接指定することもできます。

※2 後述するパスワードカラム作成時、保存が要求されますが、それを回避したいしたい等
他のカラムに干渉されることなく、特定のカラムを更新したい時に使用します

validate

validateはオブジェクトがDBに保存される前に、そのデータが正しいかどうかを検証する仕組みです。 これも軽くまとめてみます

オブジェクト 検証内容
:presence オブジェクトを保存する際に、空白を許可しません。
:length オブジェクトを保存する際の文字数を制限します。
:format フォーマットの検証を行います(※1 )
:unique 一意性を検証します。(※2)

formatについて

※1 検証には正規表現を使用することができます。

  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :hoge, format: { with: VALID_EMAIL_REGEX }

正規表現Rubularで検証することができます。

www.rubular.com

Validate内のuniquenessの大文字小文字の区別

※2 :uniqueは大文字小文字を区別しています。
大文字小文字の区別を設定するためのオプション:case_sensitiveをfalseにすると大文字小文字を区別しません。
:case_sensitiveをtrueにすると大文字小文字を区別します。

uniqueness: { case_sensitive: false }

indexの一意性について

一意性については、validateのみでは不十分です。
submitをダブルクリックなどで連続で行いリクエストが連続で行うと、一意性検査が行われる前に同じレコードが作成されてしまいます。
これを防ぐためにDBにインデックスをはり、それに一意性を持たせます。
具体的には$ rails g migration add_index_to_[テーブル名]_[カラム]を叩きます

$ rails g migration add_index_to_users_email

次に、作成されたマイグレのファイルにunique: trueを付け加えます db/migrate/[timestamp]_add_index_to_users_email.rb

class AddIndexToUsersEmail < ActiveRecord::Migration[5.0]
  def change
    add_index :users, :email, unique: true
  end
end

最後にデータベースをマイグレートします。

$ rails db:migrate

fixtures

ここで$ rails g modelを行なった際、テスト実行前にDB投入するfixtureが自動的に生成されます。
作成場所:test/fixtures/users.yml
ここのメールアドレスが一意になっていないと一意性テストが通りません。
ので使用しない場合は空にします

validatesメソッド

最後に、validates :name, presence: trueというのはvalidatesメソッドの引数を設定しているので、
validates(:name, presence: true)と書き換えることができます。

パスワード暗号化

パスワードカラムとか生で保存したくないデータを暗号化したいとき、bcryptを使うことで 暗号化することができます。
Gemfileに下記を追加します。

# パスワード暗号化Gem
gem 'bcrypt', '~> 3.1.11'
````

インストールします。<br>
` $ bundle install`

次に<u>password_digestカラム</u>を追加します<br>
`$ rails generate migration add_password_digest_to_users password_digest:string`

最後にモデルに
`has_secure_password `を追記します

class Hoge

# パスワード暗号化 has_secure_password

end

これで登録時にパスワードを生で登録時に、暗号化されて登録されます。<br>
また認証時は`authenticate`メソッドを使用します。

####NoSQLでのbcrypt
余談ではありますが、NoSQLでのbcryptの導入と使用例は下記にまとめています



[https://www.onthebacksoftheflyer.work/entry/2018/12/16/023104:embed:cite]