Logs

来世はねこです

大名エンジニアカレッジ Ruby on Rails基礎コース 3(2)

Railsの教科書」を読書会形式で、担当者を決めて読み進めていきます。

2020.11.17の後半は、第5章「モデル」の「5.1 データの永続化」〜「5.6 modeiのしくみ」まで。

教材は前回作ったものを使います。前回の続きの「create」のところが題材。

第5章「モデル」

ここでやること。データの長期保存と、その際に使うモデルについて学ぶ。

(1)データの永続化

変数の有効範囲(スコープ)について

  • ローカル変数 x = "coffee"など

メソッド内が範囲。メソッドの実行が終わると、変数とそれが指すオブジェクトは消えてしまう。

復習 「インスタンス変数を使うと、コントローラから、このあとの処理先であるビューへ情報を伝えることができます」(「Railsの教科書」「一番小さなRailsアプリづくり」より)

インスタンスとは?「クラスから生成されたオブジェクト」(「かんたんRuby」234pを基に要約)

インスタンス変数は、インスタンス内が範囲。インスタンス(オブジェクト)がなくなると一緒に消える。

Railsの場合だと1つのリクエストのことと考えて良い。よってインスタンス変数のスコープは、一つのリクエスト範囲内だと考えられる。

1つのリクエストとは、あるページをブラウザで表示すること。関連するコントローラーからビューまでは使える。別のページに行ったりリロードすると新しい別のリクエストになるので、インスタンス変数に代入した値は消える。

が❗️、一度登録したデータは、何度も見たり利用したりできる。消えていない。

???なぜだろう?

複数のリクエストに渡ってデータが保存されているということは、データは残っている。

  ⬇️

ということは、データを保存する仕事をしているしくみがあるはず。

それが「モデル」です。

(2) モデルの基本的な使い方その1 保存

データを保存できる

データ保存をしているコード

book = Book.new(title: "RubyとRailsの学習ガイド", memo: "Rails関連技術地図とそれらの学習資料の紹介")

book.save!

Book.newでBookモデルオブジェクトができ、'book_params'が渡される。

'book_params'とは本のタイトルと本のメモ

表記の決まり的なこと

  • モデル名(モデルのクラス名)は単数形・大文字始まりにする。ここではBook。全ての小文字bookは変数。代入されるのは1つのBookモデルオブジェクトなので単数形。
  • Bookモデルオブジェクトのsave!メソッド呼び出しで保存。

★保存のメソッドは他にsave, create!, createメソッドなどあり。 付いていない場合の失敗した時にはfalseになり、!が付いている場合の失敗した時には例外が投げられる。

(3)モデルの基本的な使い方その2 読み込み

保存したデータの読み込み。books = Book.all.to_a

BOOK.allでBookモデルの全データを取得できる。一覧画面「indexアクション」でこのメソッドが使われている。

to_aはArrayオブジェクトに変換するメソッドなので、配列にBookオブジェクトが詰まって返ってくる。

代入される変数名は複数books。 複数のブックオブジェクトが代入されるから。

(4)モデルの基本的な使い方その3 検索

whereメソッドを使う。

book.title``book.memoでひとつのbookオブジェクトから、タイトルやメモといった要素を取り出すことができる。

(5)実習 : rails consoleでモデルを使う

rails console」とはRailsの機能。1行ずつ入力したコードを実行する。

Rubyの機能であるirbを使っている。

irbとは「Interactive Ruby」の略。入力したプログラムを1行ずつその場ですぐに実行できる機能。1行ずつ結果を見ながらプログラムを実行できる。

★デバックに使える(「ゼロから分かるRuby 超入門 61p」より)

起動の仕方

  1. 使いたいアプリへ移動 cd アプリ名
  2. rails c
  3. 終了方法 exit
irb(main):005:1"  book = Book.new(title: "RubyとRailsの学習ガイド", memo: "Rails
irb(main):006:0>    関連技術地図とそれらの学習資料の紹介")

irb(main):007:0> book
=> #<Book id: nil, title: "RubyとRailsの学習ガイド", memo: "Rails\n   関連技術地図とそれらの学習資料の紹介", created_at: nil, updated_at: nil, author: nil>

whereを使った検索((4)モデルの基本的な使い方 その3にあった。)

book = Book.where(title: "some title").first
  Book Load (0.1ms)  SELECT "books".* FROM "books"

  WHERE "books"."title" = ? ORDER BY "books"."id" ASC LIMIT ?
  [["title", "some title"], ["LIMIT", 1]]

SQL文が示されている。

rails consoleから保存したデータも、ブラウザからリクエストを行った時と同じ様に保存されている。ブラウザから確認。

(6)modelの仕組み

model仕組みについて知るためには、Bookモデルのコードapp/models/book.rbを見る。

class Book < ApplicationRecord
end

これだけ?

saveやallのメソッドが使えるのはなぜ?

BookクラスはApplicationRecordクラス(およびさらにその親クラス)を継承しているから。ApplicationRecordクラス(およびさらにその親クラス)は、モデルの仕事に必要な機能を持っている。

titleやmemoといった要素があることをどこで知るのか?

「データベース(DB)」から。

Bookモデルにはtitle,memo要素があり(カラム)、その情報を使ってApplicationRecordはBook.titleやBook.memoメソッドを提供する。

「データベース(DB)」とは?

データを保存したり、読み出したり、検索したりするために特化したプログラムです。高速、堅牢。SQLという言語で扱う。(Rubyのコードからは扱いづらい)

  ⬇️

モデルはDBを便利に扱うための仕組みでもあり、RubyでDBを容易に扱うことができる機能も提供。

まとめ

  1. これまでの変数の仕組みではデータが保存できないこと、それを担っているのがモデルというしくみであること。
  2. モデルができること(データ保存・読み込み・検索)
  3. モデルの表記的な決まり事
  4. Rails console使い方
  5. モデルの仕組み
  6. DBとは

質問

みんなで話してみたこと

私の感想