【今日のQ&A】コンソールログの読み方【Ruby on Rails】

こんにちは、@codeship_techです。

今回は、Railsを例にとってコンソールログに出てくる内容や用語の解説をピックアップしました!

Rails以外でも役立つ知識ですので、ぜひ目を通して見てください!

Railsのコンソールで出てくる以下の「commit transaction」というログはエラー??

$ rails console
irb(main):005:0> Product.create(name: "Product1", description: "fisrt product")
  (0.1ms)  begin transaction
 Product Create (2.3ms)  INSERT INTO "products" ("name", "description", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["name", "Product1"], ["description", "fisrt product"], ["created_at", "2019-08-29 10:41:04.396182"], ["updated_at", "2019-08-29 10:41:04.396182"]]
  (2.1ms)  commit transaction
=> #<Product id: 1, name: "Product1", description: "fisrt product", created_at: "2019-08-29 10:41:04", updated_at: "2019-08-29 10:41:04">

エラーではなく、「正常にデータベースに変更を加え終えた」というメッセージです。

データベースに変更をくわえる手続きを「トランザクション」と言います。
ログはbegin transactionの部分からデータの挿入を行い、それが「正常に完了した」ことを示す commit transaction で締めくくられています。

  •  コミットとロールバックについて

トランザクションを行うとき、データベースに矛盾を起こすようなデータを挿入しないようにしなくてはなりません。
例えば、「ユーザー名を未入力の人を登録できないようにする」といったような制約を設ける必要があります。

その制約に引っかかり、矛盾したデータが挿入されそうになると、トランザクションは中断されデータベースは完全に前の状態に戻ります。
この巻き戻しを「ロールバック」と言います。

制約に引っかからず正常にデータの更新が行え、変更が反映されることを「コミット」と言います。
もし、以下のようなModelのバリデーションをつけていたとします。

app/models/product.rb

class Product < ApplicationRecord
 validates :name, presence: true
end

Productのnameは空ではいけないというバリデーションなので、以下のようにnameが空の誤ったデータを挿入しようとしても、ロールバックされるわけですね。

$ rails console
irb(main):007:0> Product.create(description:"second product")
  (0.4ms)  begin transaction
  (0.1ms)  rollback transaction
=> #<Product id: nil, name: nil, description: "second product", created_at: nil, updated_at: nil>

ちなみに直接createするのではなく、newしてからセーブする方法だと、newした段階で正常かどうか判断できます。

$ rails console
irb(main):001:0> p = Product.new(description: "third product")
=> #<Product id: nil, name: nil, description: "third product", created_at: nil, updated_at: nil>
irb(main):002:0> p.valid?
=> false
irb(main):003:0> p.errors.messages
=> {:name=>["can't be blank"]}
irb(main):004:0> p.save
  (0.4ms)  begin transaction
  (0.1ms)  rollback transaction
=> false

ログが大量に出てきたからといって、間違った動作をしているという訳でもないときもあります。
ログはフレームワークや言語の設計者からの親切なメッセージですので、必ず目を通してあげてください。

授業日記についてのご意見

CodeShipの授業について「こんな事が知りたい・紹介して」というご意見・ご提案がありましたら、CodeShip公式Twitterアカウント(【CodeShip】プログラミングスクール)までDMまたはリプライにてお寄せください。