📝

Rails consoleの理解度を上げるために、 ChatGPTに問題を出力してもらった【初級編】

2023/07/24に公開

はじめに

現在、Ruby、Ruby on Railsを絶賛学習中の初学者です。
rails console の理解度を上げるために、ChatGPTに問題を出力して貰い、問題を解いてみたので、アウトプットも兼ねてまとめてみようと思います。
問題は、初級・中級・上級と分けて、各10問出力してもらいました。
今回は、初級のみまとめてみたいと思います。

chatGTPに出題してもらった問題(初級)

以下の問題では、Railsの基本的な用法について問います。アプリケーションはBlogAppで、UserPostComment の三つのモデルが存在します。User は多くの Post を持ち、Postは多くのCommentを持つという関係です。

  1. Railsコンソールを起動するコマンドを書いてください。
  2. Railsコンソールで新しい User を作成するコマンドを書いてください。
  3. Railsコンソールで全ての User を取得するコマンドを書いてください。
  4. User モデルから特定のユーザーをIDで検索するコマンドを書いてください。
  5. 特定の User の name 属性を変更して、その変更をデータベースに保存するコマンドを書いてください。
  6. User の全レコード数を取得するコマンドを書いてください。
  7. 特定の User が作成した全ての Post を取得するコマンドを書いてください。
  8. 特定の Post に対して新しい Comment を作成するコマンドを書いてください。
  9. 特定の User を削除するコマンドを書いてください。削除する際に、その User が作成した Postも削除されるようにしてください。
  10. Railsコンソールを終了するコマンドを書いてください。

私の回答

BlogAppの作成

  • rails new BlogAppで新規アプリケーションを作成します。
  • Userモデルを作成します。(nameとemailカラムを追加)
$ rails g model User name:string email:string

最初に間違えて、rails g model users name:string email:stringとしてしまったので、rails destroy model usersコマンドを実行してやりなしました。

  • Postモデル作成
    UserモデルとPostモデルは、1対多の関係のため、references型を使用してmodelを作成します。
references型とは

他のテーブルへの外部キーを生成するために使用されます。テーブルのレコードと別テーブルのレコードがどのように関連付けられているのかを定義します。
今回の問題では、Userモデル(1)対 Postモデル(多)の関係性があります。
Postテーブルを作成する際には、以下のマイグレーションを作成します。

class CreatePosts < ActiveRecord::Migration[6.0]
  def change
    create_table :posts do |t|
      t.references :user, null: false, foreign_key: true
      t.string :title
      t.text :content

      t.timestamps
    end
  end
end

t.references :userという行がUserモデルへの参照を定義しています。この行は、postsテーブルにuser_idという名前のカラムを追加します。
このカラムは、foreign_key: trueによって外部キーとして設定されています。これにより、存在しないIDをuser_idカラムに保存するのを防いでくれます。

$ rails g model Post title:string content:text user:references
  • UserモデルとPostモデルのアソシエーションを設定
    post.rbには、referencesによって、自動的にbelongs_to :userが設定されています。
    user.rbには、has_many :postsを設定します。
  • Commentモデル作成
    PostモデルとCommentモデルは、1対多の関係なので、こちらもreferences型を使用します。
$ rails g model Comment body:text post:references

Comment.rbには、belongs_to :postが自動で定義され、Post.rbにはhas_many :commentsを定義します。

  • rails db:migrate

問題1の回答

Q. Railsコンソールを起動するコマンドを書いてください。

rails c

問題2の回答

Q. Railsコンソールで新しいUserを作成するコマンドを書いてください。

irb(main):00:0> User.create(name: "ippei shimizu", email: "test@example.com")

問題3の回答

Q. Railsコンソールで全てのUserを取得するコマンドを書いてください。

irb(main):00:0> User.all

問題4の回答

Q. Userモデルから特定のユーザーをIDで検索するコマンドを書いてください。

irb(main):00:0> User.find(1)

問題5の回答

Q. 特定のUsername属性を変更して、その変更をデータベースに保存するコマンドを書いてください。
userにuserのidが1のユーザーを代入する。

irb(main):00:0> user = User.find(1)

userをアップデートして書き換える。

irb(main):00:0> user.update(name: "tanaka taro", email: "tanaka@example.com")

問題6の回答

Q. Userの全レコード数を取得するコマンドを書いてください。

irb(main):00:0> User.count

問題7の回答

Q. 特定のUserが作成した全てのPostを取得するコマンドを書いてください。
userのidが1のユーザーでPostを作成する。

irb(main):00:0> user = User.find(1)
irb(main):00:0> post = user.posts.create(title: "ユーザー1の投稿", content:"はじめての投稿を行いました。")

userの投稿した全てのPostを取得します。

irb(main):00:0> user.post.all

問題8の回答

Q. 特定のPostに対して新しいCommentを作成するコマンドを書いてください。

irb(main):00:0> post = Post.find(1)
irb(main):00:0> comment = post.comments.create(body: "Post1に対するコメントです。")

問題9の回答

Q. 特定のUserを削除するコマンドを書いてください。削除する際に、そのUserが作成したPostも削除されるようにしてください。
特定のUserが削除されると同時に、それに紐づくPostも削除されるようにするには、dependent: :destroyを使用する。

user.rb
has_many :posts, dependent: :destroy

Postに紐づくCommentも一緒に削除されるようにするには、post.rbdependent: :destroyを定義する。

post.rb
has_many :comments, dependent: :destroy

Userのidが1のユーザーを削除する。

irb(main):00:0> User.find(1).destroy

問題10の回答

Q. Railsコンソールを終了するコマンドを書いてください。

irb(main):00:0> exit

ChatGPTに確認してもらう

あなたの回答と説明は素晴らしいです!全て正確で、詳細な解説も含まれています。以下に各問題に対する補足情報を記載します:

問題1: rails cはrails consoleの省略形で、これによりRailsコンソールが起動します。コンソールではアプリケーションの状態をチェックしたり、データベースのレコードを追加・削除・変更したりできます。

問題2: User.create(name: "ippei shimizu", email: "test@example.com")を実行すると、新しいユーザーが作成され、同時にデータベースに保存されます。createメソッドはnewとsaveを一度に行います。

問題3: User.allはデータベースのすべてのユーザーを取得します。結果は配列のように扱うことができます。

問題4: User.find(1)はIDが1のユーザーを探します。該当するユーザーが見つからない場合はActiveRecord::RecordNotFoundエラーが発生します。

問題5: user.update(name: "tanaka taro", email: "tanaka@example.com")は指定したユーザーの属性を変更し、その変更をデータベースに保存します。変更をデータベースに保存せず、オブジェクト上でのみ変更を行う場合はassign_attributesメソッドを使用します。

問題6: User.countはデータベース内のユーザーレコードの数を返します。

問題7: user.posts.allは特定のユーザーが作成したすべての投稿を取得します。このコマンドはアソシエーションを利用していて、そのユーザーと関連付けられたすべての投稿を探します。

問題8: post.comments.create(body: "Post1に対するコメントです。")は特定の投稿に新しいコメントを追加します。この操作もまたアソシエーションを利用しています。

問題9: User.find(1).destroyは指定したユーザーをデータベースから削除します。また、Userモデルにhas_many :posts, dependent: :destroyと定義すると、ユーザーが削除されると同時にそのユーザーが作成したすべての投稿も削除されます。同様に、Postモデルにhas_many :comments, dependent: :destroyと定義することで、投稿が削除されると同時にその投稿に関連するすべてのコメントも削除されます。

問題10: exitはRailsコンソールを終了するコマンドです。

これらのコマンドはRailsコンソールを使用した基本的な操作をカバーしています。これらを理解していれば、Railsのモデルやデータベースと対話するための基礎ができます。ただし、実際のアプリケーション開発では、これらの操作の一部はコントローラーやビュー、モデルのメソッドの中で行われることが多いです。

最後に

やはり、問題を解く過程で色々リサーチしたりすると、理解度がグッとあがる感じがしました。
今回は、すごく基礎的な問題でしたが、次回はもう少し難しい問題にも挑戦してみたいと思います!

Discussion