📍

パーフェクトRuby on Rails

に公開

はじめに

RoRを業務で使い始めて2年経ち、3年を皮切りに一旦基本を押さえておきたいなと思い、表題の本を読み始めました。毎日少しずつではありますが読み進めていく中で、知らなかったところや理解が曖昧だったところなどメモとして残していくつもりです。また一度に全てを書くのは文量的にも厳しいと思いますので随時更新していきます。

更新履歴

日付 更新箇所 備考
2024/08/21 bundlerとは 新規
2024/09/06 ActiveModelのScopeは使い方に注意 新規
2024/09/07 ActiveRecord::Enum(列挙型) 新規

bundlerとは

bundlerはgemをインストールしたり、gemのお互いの補完やバージョンなどを管理してくれるライブラリ。
Gemfilebundle initを実行することで生成され、bundle installGemfileに記述されたgemをインストールすることができる。

Gemfileに記述され、インストールしたgemGemFile.lockファイルとして保存する。
ちなみにrailsbundlerによって管理されている。

railsの機能(ex. コンソール、サーバー起動、ルーティング確認)を利用したい時、以下のようなコマンドを実行するで利用可能。以下のコマンドはBundlerによってインストールされたgemを利用してコマンドを実行している。なので下記のrailsはインストールしたrails gemを指している。

bundle exec rails 〜

以下の実行の方法もあるが、やっていることは同じ
利便性や一貫性の為に、bundle execを付けなくても実行できるコマンドをbinディレクトリに用意している。(このようなファイルをbinstubと呼ぶ。)

bin/rails ~

ActiveModelのScopeは使い方に注意

検索結果が0件となる可能性がある条件文はscopeに定義しない方が良い。
scopeは検索結果が0件になる条件文を無視してしまう。

Book.all
Book.auther("tanaka")

autherscopeメソッドとして定義されてる。
この時、もし著者のtanakaさんの本が存在しない場合、Book.allと同じ挙動を起こしてしまう。

ActiveRecord::Enum(列挙型)

class Book < ApplicationRecord
  enum sales_status: {
    reservation: 0,  # 予約受付
    now_on_sale: 1,  # 発売中
    end_of_print: 2, # 販売終了
  }
  # 略
end

上記のようにenumを定義した後、booksaveする際、book.sales_statusにはシンボルで:now_on_saleと入れても、数値で1で入れても、文字列で"now_on_sales"と入れても、返却されるBookインスタンスのsales_statusには文字列のnow_on_saleが表示される。
また、enumに定義されてない値を入れようとすると、エラーが発生する。

利用できるようになるインスタンスメソッド

さらに、enumを使って列挙型を定義すると新たなメソッドが使用できるようになる。
例えば、book.now_on_sale?truefalse

他にもbook.sales_status_before_type_castbook.sales_statusnow_on_saleの場合、1が返却される。

利用できるようになるクラスメソッド

クラスメソッドとしてもenumで定義したカラム名の複数形のメソッドを使える。
Book.sales_statuses → {"reservation"=>0, "now_on_sale"=>1, "end_of_print"=>2}

scopeも新たに使えるようになる。
Book.now_on_salesales_status1のレコードを検索、取得してくれる。

Discussion