Ruby on Railsのチュートリアル ~第6章ユーザーのモデルを作成する~

# はじめに
webアプリケーションを作るための学習記録
（マッチングアプリを作る予定）

こちらのチュートリアルを片っ端から進めていく
【Ruby on Rails チュートリアル】
https://railstutorial.jp/


# 第6章ユーザーのモデルを作成する
## まとめ
- マイグレーションを使うことで、アプリケーションのデータモデルを修正することができる
- Active Recordを使うと、データモデルを作成したり操作したりするための多数のメソッドが使えるようになる
- Active Recordのバリデーションを使うと、モデルに対して制限を追加することができる
- よくあるバリデーションには、存在性・長さ・フォーマットなどがある
- 正規表現は謎めいて見えるが非常に強力である
- データベースにインデックスを追加することで検索効率が向上する。また、データベースレベルでの一意性を保証するためにも使われる
- has_secure_passwordメソッドを使うことで、モデルに対してセキュアなパスワードを追加することができる


## 所感
・もうSQLいらないんだなー。すごく便利。
・ここあたりまでくると前に勉強した内容を忘れつつある。復習して身につけないと。
・SQLに代わるrailsでのコマンドをまとめておく

#### CREATE

```
rails generate model User name:string email:string #モデルの作成,create
```

#### INSERT
```
user = User.new(name: "Michael Hartl", email: "mhartl@example.com") #メモリ上にレコード作成
user.save #テーブルに保存
user = User.create(name: "A Nother", email: "another@example.org") #上記を一発で
```

#### SELECT
````
User.find(1) # SELECT  "users".* FROM "users" WHERE "users"."id" = 1
User.find_by(email: "mhartl@example.com") # SELECT  "users".* FROM "users" WHERE "users"."email" = "mhartl@example.com"
User.first # SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT 1
User.all # SELECT  "users".* FROM "users" 
````

#### UDATE
```
user.email = "aa@com" # メモリ上のみUpdate
user.save #テーブルに保存
user.update_attribute(:name, "El Duderino") #上記を一発で
user.update_attributes(name:"mori",email:"bb@com")
user.reload #DB内の情報をメモリに再読み込みする、save前ならメモリの変更を戻せる
```

#### DELETE
```
user.destroy # DELETE FROM "users" WHERE "users"."id" = ?  テーブルから削除、メモリ上には残る
```

#### エラーチェック
```
user.valid? # バリデーションに引っかかるなどしたらfalseになる
user.errors.full_messages
user.errors.messages
user.errors[:name]
```

#### MIGRATE
```
rails db:migrate # migrationファイル内の変更をDBに反映させる、スキーマ変更時に使う？
rails db:rollback # migrate前に戻す
rails db:migrate VERSION=0 # 一番最初の状態に戻す
```
## 途中参考にしたページ

・【Rails】バリデーションのエラーメッセージを表示する
https://blog.yuhiisk.com/archive/2018/05/22/rails-display-error-message.html
u.errors[:email]

・instance method Object#inspect
https://docs.ruby-lang.org/ja/latest/method/Object/i/inspect.html
オブジェクトを人間が読める形式に変換した文字列を返します。

・メソッドの末尾に!を付け足すことにより、email属性を直接変更できるようになるとは？
https://teratail.com/questions/112287
つまりemail = email.downcaseという風に代入するでなく、email.downcase!として元々の変数を破壊的に変更しているということ

・Railsチュートリアル で地味にめんどくさいことの対策
https://qiita.com/tathuhi10/items/281c0d8e03438e0e752c
vi ~/.bashrc
PATH=/usr/local/heroku/bin:$PATH
ちなみにパスを通さずそのままbin直下のファイルを実行もできたが、「--app」というオプションを求められた
sample_appのディレクトリ内ならこのオプションなしでいけた

・Heroku CLIでアプリ名指定を要求される場合の対策
https://wbtmiu.herokuapp.com/2014/09/26/6V3BrydvOx/
アプリ用ディレクトリにある.git/configの中に、紐付けがある

## 使用したコマンド
git checkout -b modeling-users
rails generate model User name:string email:string
rails db:migrate
rails db:rollback
rails db:migrate VERSION=0

rails console --sandbox
User.new
user = User.new(name: "Michael Hartl", email: "mhartl@example.com")
user.valid?
user.save
user.name
user.email
User.create(name: "A Nother", email: "another@example.org")
foo = User.create(name: "Foo", email: "foo@bar.com")
foo.destroy
User.find(1)
User.find_by(email: "mhartl@example.com")
User.first
User.all
User.find_by(name:"A Nother")
User.find_by_name("A Nother")
User.all.length
user.email = "aa@com"
user.reload
user.update_attributes(name:"mori",email:"bb@com")
user.update_attribute(:name, "El Duderino")
user2 = User.find(2)
user.created_at = 1.year.ago

rails test:models
user.errors.full_messages
u.errors.messages
u.errors[:name]

user.dup
rails generate migration add_index_to_users_email
rails db:migrate

rails generate migration add_password_digest_to_users password_digest:string
rails db:migrate
bundle install

rails console
User.create(name: "Michael Hartl", email: "mhartl@example.com",password: "foobar", password_confirmation: "foobar")
user = User.find_by(email: "mhartl@example.com")
user.password_digest
user.authenticate("foobaz")
!!user.authenticate("foobar")

user = User.find(1)
user.name = "aa"
user.save
user.update_attribute(:name,"xx")

rails test
git add -A
git commit -m "Make a basic User model (including secure passwords)"
git checkout master
git merge modeling-users
git push
rails test
git push heroku
cd /home/ec2-user/environment/sample_app
/usr/local/heroku/bin/heroku run rails db:migrate
/usr/local/heroku/bin/heroku run rails console --sandbox
User.create(name: "Michael Hartl", email: "michael@example.com",password: "foobar", password_confirmation: "foobar")