Railsコンソールでのデータ編集

Railsでコンソールをもっと使って学習していこうと思い、コンソールでの基礎的なデータ編集のやり方をまとめました。

### irbとは

「Interactive Ruby」の略。Rubyにデフォルトで用意されているデバックツール。

### pryとは

pryの語源はよくわからなかったが、これもRailsに用意されたデバックツール。使用するにはGemのインストールが必要。Syntaxの色付けやインデントがされていて、irbよりも見やすいかも。
pry-byebugも一緒に入れると、binding.pryでプログラムを止めた際に1行ずつプログラムを先に進めるなどデバックをする際にできることが増える。

pry-byebugに関する参考記事

> https://ichigick.com/rails-pry-byebug/
> 

### pryのインストール

Gemfileに以下のコードを追記し、ターミナルで`$ bundle install` をすれば使えるようになります。

```ruby:Gemfile
gem 'pry-rails', :group => :development
gem 'pry-byebug', :group => :development
```

## コンソールでデータベースの操作

### コンソールの立ち上げ・抜け出し

`$ rails c`で立ち上げ、`exit`もしくは`Ctrl+D`で抜け出せる。

### レコードの作成

レコードを作成する際は、createメソッドを使う。createの後に”!”(エクスクラメーションマーク)をつけると、データの作成に失敗した時エラーを返してくれます。

```ruby
[1] pry(main)> モデル名.create(カラム名："カラムの値")
```

実行例

```ruby
[1] pry(main)> User.create!(name: "山本 一郎", age: 47, address: "福島県")
TRANSACTION (0.1ms)  BEGIN
  User Create (2.6ms)  INSERT INTO "users" ("name", "age", "address", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["name", "山本 一郎"], ["age", 47], ["address", "福島県"], ["created_at", "2024-02-16 05:38:59.249919"], ["updated_at", "2024-02-16 05:38:59.249919"]]
  TRANSACTION (0.9ms)  COMMIT
=> #<User:0x00000001623dc508
 id: 1,
 name: "山本 一郎",
 age: 47,
 address: "福島県",
 created_at: Fri, 16 Feb 2024 05:38:59.249919000 UTC +00:00,
 updated_at: Fri, 16 Feb 2024 05:38:59.249919000 UTC +00:00>
```

### レコードの取得

#### all
allメソッドで、そのテーブル（モデル）のレコードを全て取得できる。

```ruby
[1] pry(main)> モデル名.all

#例
[1] pry(main)> User.all
```

#### find
findメソッドでレコードのidから取得できる。

```ruby
[1] pry(main)> モデル名.find(id)

#例
[1] pry(main)> User.find(1)

#複数でも指定できる
[1] pry(main)> User.find(1, 3)
```
#### find_by

find_byメソッドで特定の条件にマッチした最初のレコードを取得できる。条件を指定して複数取得する場合はwhereメソッドを使う。

```ruby
[1] pry(main)> モデル名.find_by(条件)

#例
[1] pry(main)> User.find_by(address: "静岡県")
```

#### where

whereメソッドで特定の条件にマッチしたレコードを複数で取得できる。

```ruby
[1] pry(main)> モデル名.where(条件)
```

> [Railsドキュメント](https://railsdoc.com/page/model_where)
> 

### レコードの内容変更

#### update
updateメソッドで指定したレコードの値を変更できる。

```ruby
[1] pry(main)> 対象.update(カラム名1:値1, カラム名2:値2, カラム名3:値3,,,)

#例
[13] pry(main)> User.find_by(name: "山本 一郎").update(address: "山形県")
```

### レコードの削除

#### destroy
destroyメソッドでレコードを１つだけ削除できる。対象のレコードだけでなく、関連づけられたデータも自動的に削除される。

```ruby
[1] pry(main)> 対象.destroy

#例
[1] pry(main)> User.find(1).destroy
```

#### destroy_all
destroy_allメソッドで複数の指定したレコードを削除できる。whereと一緒に使われる。対象のレコードだけでなく、関連づけられたデータも自動的に削除される。

```ruby
[1] pry(main)> 対象.destroy_all

#例
[1] pry(main)> User.where(id:2..3).destroy_all
```

#### delete
deleteメソッドは、destroyメソッドと同じく1つのレコードを削除するメソッドだが、関連付けられたデータは削除されない。

```ruby
[1] pry(main)> 対象.delete

#例
[1] pry(main)> User.find(1).delete
```

delete_allメソッドも、destroy_allメソッドと同じく指定した複数のレコードを削除するメソッドだが、関連付けられたデータは削除されない。

### 参考にしたサイト
- **【Rails】コンソールからモデルを使ってテーブルの一覧表示やデータ追加・更新・変更・削除する方法(データベース操作)**

https://prograshi.com/framework/rails/use-db-from-console/

- **しっかり使い分け！Railsでのfind, find_byの違い、使い方**

https://www.sejuku.net/blog/13000

- **【Rails入門】consoleの使い方まとめ**

https://www.sejuku.net/blog/29910#index_id2

- **RailsコンソールでModelを操作する**

https://rails-ambassador.herokuapp.com/lessons/ManipulateTheModel