Rails tutorialの第6章を終えました。 その時の気づいたこととか備忘録を何部かに分けて。 今回はモデル作成について
model作成
以下のDBに対して、やり取りを行うUserモデルを作成します。
Usersテーブル
カラム | 型 |
---|---|
name | String |
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
詳細は下記の詳細が詳しいです。
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 }
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]