大名エンジニアカレッジ Ruby on Rails基礎コース 3(2)
「Railsの教科書」を読書会形式で、担当者を決めて読み進めていきます。
2020.11.17の後半は、第5章「モデル」の「5.1 データの永続化」〜「5.6 modeiのしくみ」まで。
教材は前回作ったものを使います。前回の続きの「create」のところが題材。
第5章「モデル」
ここでやること。データの長期保存と、その際に使うモデルについて学ぶ。
(1)データの永続化
変数の有効範囲(スコープ)について
- ローカル変数 x = "coffee"など
メソッド内が範囲。メソッドの実行が終わると、変数とそれが指すオブジェクトは消えてしまう。
- インスタンス変数 @bookなど(@ではじまる。)
復習 「インスタンス変数を使うと、コントローラから、このあとの処理先であるビューへ情報を伝えることができます」(「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行ずつ入力したコードを実行する。
irbとは「Interactive Ruby」の略。入力したプログラムを1行ずつその場ですぐに実行できる機能。1行ずつ結果を見ながらプログラムを実行できる。
★デバックに使える(「ゼロから分かるRuby 超入門 61p」より)
起動の仕方
- 使いたいアプリへ移動
cd アプリ名
rails c
- 終了方法
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を容易に扱うことができる機能も提供。
まとめ
- これまでの変数の仕組みではデータが保存できないこと、それを担っているのがモデルというしくみであること。
- モデルができること(データ保存・読み込み・検索)
- モデルの表記的な決まり事
- Rails console使い方
- モデルの仕組み
- DBとは