Ruby On RailsでCRUDを学ぶ。
CRUDとは、Web開発者にとっては必ず知っておきたい用語の一つです。
CRUDは、基本となるデータ操作の頭文字をとって名付けられ
- Create ・・・ データの作成
- Read ・・・データの参照
- Update ・・・データの更新
- Delete ・・・データの削除
これはWebアプリケーションを開発する上での基本中の基本となるので、必ず覚えておきましょう。自分の経験のない新しいWebフレームワークを勉強する際には、まずこの4つの操作方法を覚えておくことが大切です。
実際の業務アプリケーションとなるとこれらを組み合わせてさらに複雑なデータの操作を行いますが、ひとつひとつの処理をみるとCRUDのいずれかの処理に分類することができるので、それぞれ違いくらいは必ず覚えておきましょう。
Ruby On RailsでのCRUD
Webアプリケーションに必須のCRUD機能ですが、Ruby On Railsでは、Scaffoldという機能を使うとあっというまにこのCRUDの雛形を作成してしまうことができます。
まずは簡単に本のリストを新規登録・作成・更新・削除する機能を作る場合は、
bundle exec rails g scaffold Book
というコマンドを叩けば、CRUDに必要なコードを自動で生成してくれます。コードというとモデルやビュー、コントローラなど全てのコードも生成してくれますが、マイグレーションコードも同時に作成してくれます。
$bundle exec rails g scaffold Book
Running via Spring preloader in process 19684
invoke active_record
create db/migrate/20180702132524_create_books.rb
create app/models/book.rb
invoke rspec
create spec/models/book_spec.rb
invoke factory_bot
create spec/factories/books.rb
invoke resource_route
route resources :books
invoke scaffold_controller
create app/controllers/books_controller.rb
invoke erb
create app/views/books
create app/views/books/index.html.erb
create app/views/books/edit.html.erb
create app/views/books/show.html.erb
create app/views/books/new.html.erb
create app/views/books/_form.html.erb
invoke rspec
create spec/controllers/books_controller_spec.rb
create spec/views/books/edit.html.erb_spec.rb
create spec/views/books/index.html.erb_spec.rb
create spec/views/books/new.html.erb_spec.rb
create spec/views/books/show.html.erb_spec.rb
create spec/routing/books_routing_spec.rb
invoke rspec
create spec/requests/books_spec.rb
invoke helper
create app/helpers/books_helper.rb
invoke rspec
create spec/helpers/books_helper_spec.rb
invoke jbuilder
create app/views/books/index.json.jbuilder
create app/views/books/show.json.jbuilder
create app/views/books/_book.json.jbuilder
invoke test_unit
create test/system/books_test.rb
invoke assets
invoke coffee
create app/assets/javascripts/books.coffee
invoke scss
create app/assets/stylesheets/books.scss
invoke scss
identical app/assets/stylesheets/scaffolds.scss
コードが自動生成できたので、マイグレーションコードを編集して必要なカラムだったりを追加していけばCRUDの完成です。
ModelとしてのCRUD
本来CRUDはデータ操作のための用語ですので、モデルに対する用語ですが、文脈によってはGUIベースのViewやコントローラも含めてCRUDと呼ぶことができます。
このように広い意味のCRUDもありますが、一旦はModelだけに絞ってCRUDを理解すると、CRUDそれぞれの要素はSQLのひとつひとつにマッピングすることができます。
CRUD | SQL |
---|---|
Create | INSERT |
Read | SELECT |
Update | UPDATE |
Delelte | DELETE |
CRUD | Rails |
---|---|
Create | create/create!, save/save! |
Read | find, find_by, where, allなど |
Update | update/update!, save/save!など |
Delete | delete/delete!, destroy/destroy! |
実際にCRUDしてみる
おのおのの、CRUDの細かい部分は個別に説明した記事を用意しますが、ひとまずはひとつずつCRUDの操作をしてみましょう。下準備
用意するのはrailsのプロジェクトです。railsがすでにインストール済みなら、適当なプロジェクト名で
rails new crud_sampleとしましょう。
プロジェクトができたら今回はmysqlを使って説明するので,mysqlをセットアップします。(とくにmysqlである必要もありませんが、わかりやすいので)
今回使用するモデルは、Bookモデルというものを使うので、あらかじめ作成しておきます。
bundle exec rails g model Book title:string author:string
bundle exec rake db:migrate
用意ができたら、2ウィンドウを立ち上げてそれぞれのコマンドを叩きます。
# rails consoleを起動
# ここで実際のRailsのコマンドを試し打ちできる
bundle exec rails console
# railsから使用するデータベースに接続
bundle exec rails db
これで、railsからのデータ操作を直接DBで確認することができます。
コマンドを確認していく
まず、データベースに接続した方のウィンドウでbooksテーブルにレコードが存在しないことを確認します。mysql> select * from books;
Empty set (0.00 sec)
Create
次に、createメソッドでレコードを作成してみます。
Book.create(title: '1Q84', author: 'Haruki Murakami')
ここでエラーが出ていなければレコードが作成されているので、 直接DBを見てみます。
> select * from books;
+----+-------+-----------------+---------------------+---------------------+
| id | title | author | created_at | updated_at |
+----+-------+-----------------+---------------------+---------------------+
| 1 | 1Q84 | Haruki Murakami | 2018-07-03 00:15:43 | 2018-07-03 00:15:43 |
+----+-------+-----------------+---------------------+---------------------+
1 row in set (0.00 sec)
Select
次にテーブルのレコードはallメソッドでも取得できるので、rails consoleの方でレコードが存在することを確認します。
Book.all
Book Load (0.6ms) SELECT `books`.* FROM `books` LIMIT 11
=> #]>
Bookオブジェクトの配列が返却されたので、レコードが存在することがわかります。
Update
次にこのデータを更新してみます。
book = Book.first
book.update(author: 'XXXXX')
モデルの更新はupdateメソッドを利用して行います。メソッド実行後DBを確認してみてもauthorが更新されているのがわかります。
mysql> select * from books;
+----+-------+--------+---------------------+---------------------+
| id | title | author | created_at | updated_at |
+----+-------+--------+---------------------+---------------------+
| 1 | 1Q84 | XXXXX | 2018-07-03 00:15:43 | 2018-07-03 00:19:30 |
+----+-------+--------+---------------------+---------------------+
1 row in set (0.00 sec)
Delete
ここまでで、Create,Update,Select(Read)はできたので最後にこのレコードを削除します。 レコードの削除はdestroyメソッドを使います。
book = Book.first
book.destroy
これでレコードが削除できます。
> Book.count
(0.5ms) SELECT COUNT(*) FROM `books`
=> 0
まとめ
ここまでで一通りCRUDの操作はできたかと思いますが、突き詰めるともっともっと覚えることがあります。
例えば、SELECTを行うときに条件で絞り込みをしたいときはどうするのか?他のテーブルとjoinするにはどうするのか?一度に複数のレコードを削除したい場合は?
などなど覚えることは色々とあります。ただ、今回のでそれぞれの基礎となる操作は覚えられたはずなので、次回以降の記事でそれぞれもう少し詳しく見ていければなと思います。