サカナ未遂

プログラミング、筋トレ、子育て

パーフェクトRuby on Rails 増補改訂版 2章〜3章を読んだ

と続けて読んだので、そのままパーフェクトRuby on Rails増補改訂版を2章〜3章読んだ。

Rails本2冊読んだばかりなので、知ってる箇所を飛ばして、知らないところについてまとめた。

2章

ActiveRecord::Relation

ActiveRecord::Relationは内部でどのようなSQLを発行するか、という情報だけを保持する。実際にSQLの実行結果が必要になるまではDBへのアクセスは発生しない。 メソッドチェインによるクエリ構築を行うためこのように設計されている。 明示的に任意の箇所でSQLを発行したい場合はto_aメソッドを呼び出して即座にSQLを発行できる。

Scopeの定義

Scopeで定義した条件の結果がnilの場合、該当Scopeの検索条件を除外したクエリを発行するので意図しない結果になることがある nilを返す必要がある場合はクラスメソッドとして定義する方が良い。

ActiveRecord::Enum

sales_statusカラムに対して以下のようにenumを設定する。

class Book < ApplicationRecord
  enum sales_status: {
    reservation: 0,
    now_on_sale: 1,
    end_of_print: 2,
  }
end

ステータス毎に述語メソッドで状態を問い合わせることが可能

pry(main)> book = Book.last
pry(main)> book.reservation?
=> true

# !をつけるとそのenum値へ更新することができる。
pry(main)>  book.now_on_sale!
pry(main)>  book.now_on_sale?
=> true

# カラム名_before_type_castで実際の値を確認することができる。
 pry(main)> book.sales_status_before_type_cast
=> 1

enum型の名称で検索するためのscopeも追加される。

 pry(main)> Book.reservation
  Book Load (0.1ms)  SELECT "books".* FROM "books" WHERE "books"."sales_status" = ?  [["sales_status", 0]]
=> [#<Book:0x00007fbf8eb082b8
  id: 3,
  name: "enum Book 1",
  published_on: nil,
  price: 100,
  created_at: Mon, 11 Jan 2021 02:35:23.632974000 UTC +00:00,
  updated_at: Mon, 11 Jan 2021 02:38:22.399098000 UTC +00:00,
  publisher_id: 1,
  sales_status: "reservation">]

その他

  • デフォルトスコープはモデルクラスの操作全てに影響を与えるので注意深く検討してから使用すべき。
  • コールバックが実行されないメソッドの実行は気を付ける(update_系とか)

3章

Rackとは?

RackはWebアプリケーションサーバーとRailsの間に存在する。 Rackを経ることでアプリケーションサーバーとRails疎結合になるので、それぞれの組み合わせを変更することが容易になる。 Rackからフレームワーク層に到達するまでに処理を挟むことができるRackミドルウェアと呼ばれる機構があって、独自の処理やよく使う機能を差し込むこともできる。 Rackが利用するエントリーポイント用ファイルは一般的にはconfig.ruというファイルを利用する。

感想

Rails本3冊目なので、もっと早く読み終わると思ってたが、思った以上に内容が充実していて、3章まででも結構時間がかかった。 さすがのパーフェクトシリーズで、もはやRuby自体の説明はなく、いきなりRailsの説明から入る初級者をぶった切った内容、渋い。
Rubyの経験がない人はチェリー本Ruby自体を勉強してから望んだ方が良いと思う。 Ruby覚えて、これからRailsを覚えたい人は、まずRailsの教科書を読んでから挑戦した方が理解が進むと思われる。 4章以降もかなり濃い内容なのでまとめていくには時間がかかりそう。ゆっくり読んでいきます。