Ruby On RailsでCRUDを学ぶ。

 

CRUDとは、Web開発者にとっては必ず知っておきたい用語の一つです。

CRUDは、基本となるデータ操作の頭文字をとって名付けられ

  • Create ・・・ データの作成
  • Read ・・・データの参照
  • Update ・・・データの更新
  • Delete ・・・データの削除
のそれぞれの頭文字をとってCRUDとなっています。

これは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
Ruby on Railsではその他多くのWebアプリケーションフレームワークがそうであるように、このSQLを発行するためのメソッドがモデルのクラスに実装されています。

 

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するにはどうするのか?一度に複数のレコードを削除したい場合は?

などなど覚えることは色々とあります。ただ、今回のでそれぞれの基礎となる操作は覚えられたはずなので、次回以降の記事でそれぞれもう少し詳しく見ていければなと思います。