プログラミングの勉強日記
2020年7月13日 Progate Lv.186
Ruby on RailsⅡ
データベースとは
テキストや数値などのデータを保存するためのツール。データベースは表でデータを管理している。表のことをテーブル、縦の列のことをカラム、横の列のことをレコードという。必要に応じて複数のテーブルを作成できる。
データベースの用意
マイグレーションファイルと呼ばれるデータベースに変更を指示するためのファイルを作成する。rails g model モデル名 カラム名:型
で作成できる。モデル名は必ず最初を大文字にして、単数形にする。なので、postsテーブルを作成するが、この場合単数形にする。モデルについては下で記述する。
マイグレーションファイルはdb/migrate
フォルダの下に作成される。
$ rails generate model Post content:text
これを実行すると、app/models
フォルダにモデルが定義されたファイルと、db/migrate
フォルダにマイグレーションファイルの2つのファイルが生成される。
データベースに変更を反映する
rails db:migrate
コマンドを実行すると、データベースに変更を反映できる。テーブル作成時にはid
、created_at
、updated_at
が自動生成される。データベースに反映されていないマイグレーションファイルが存在する状態でページにアクセスすると、マイグレーションエラーが発生する。なので、マイグレーションファイルを作成した場合は必ずこのコマンドを実行する。
Postモデル
モデルはテーブルを操作するための特殊なクラスである。rails generate model
コマンドでpostsテーブルを操作するためにPostモデルが定義されたファイルpost.rb
がapp/models
フォルダの中に作成されている。ファイルの中にはApplicationRecord
クラスを継承するPost
クラスが定義されている。ApplicationRecord
を継承したクラスをモデルという。
class Post < ApplicationRecord
end
rails console
ターミナルでrails console
と入力し、実行(Enter)するとコンソールを起動できる。コンソールはquit
を実行すると終了する。コンソールでは変数を定義することができ、quit
でコンソールを終了するまで使い続けられる。
$ rails console
>text="Hello"
=>"Hello"
>text+"World"
=>"HelloWorld"
>quit
テーブルにデータを作成
postsテーブルにデータを追加するためには、newメソッドでPostモデルのインスタンスを作成し、postsテーブルに保存する。
1. rails console
を使ってPostモデルからPostインスタンスを作成する。インスタンスを作成するにはnewメソッドを使う。
2. 作成したPostインスタンスをpostsテーブルに保存するためにはsaveメソッドを使う。(saveメソッドを使えるのはPostモデルがApplicatuonRecordを継承しているから)
$ rails console
>post=Post.new(content:"HelloWorld")
>post.save
テーブルからデータを取り出す
Post.first
とすることでpostsの最初のデータを取得することができる。
post.content
とすることで、Post.first
で取得したデータから投稿内容を取得できる。
$ rails console
> post=Post.first
> post.content
=> "今日から…"
テーブルに保存されているすべてのデータを取得するにはPost.all
を使う。テーブルにあるすべてのデータが配列で取得できる。投稿の配列から1つのデータを取り出すためには、Post.all[0]
のようにインデックス番号で1つの要素を取得する。Post.all[0].content
とすることで投稿内容を取得する。
$ rails console
> posts=Post.all[0].content
=> "今日から…"
データベースの表示
ビューで使う変数はアクションで定義するのが一般的である。通常はアクションで定義した変数はビューで使えないが、変数名を@
から始めることで特殊な変数となり、ビューファイルでも使うことができる。
postsコントローラのindexアクション内の@posts
にPost.allで取得したデータを代入する。ビューでは@posts
に代入されている配列のデータを1つずつ変数postに代入して投稿内容を繰り返し表示させる。
def index
@posts=Post.all
end
<% @posts.each do |post| %>
<div class="post-index-item>
<%= post.content %>
</div>
<% end %>