パーフェクトRuby on Rails
はじめに
RoRを業務で使い始めて2年経ち、3年を皮切りに一旦基本を押さえておきたいなと思い、表題の本を読み始めました。毎日少しずつではありますが読み進めていく中で、知らなかったところや理解が曖昧だったところなどメモとして残していくつもりです。また一度に全てを書くのは文量的にも厳しいと思いますので随時更新していきます。
更新履歴
| 日付 | 更新箇所 | 備考 |
|---|---|---|
| 2024/08/21 | bundlerとは | 新規 |
| 2024/09/06 | ActiveModelのScopeは使い方に注意 | 新規 |
| 2024/09/07 | ActiveRecord::Enum(列挙型) | 新規 |
bundlerとは
bundlerはgemをインストールしたり、gemのお互いの補完やバージョンなどを管理してくれるライブラリ。
Gemfileはbundle initを実行することで生成され、bundle installでGemfileに記述されたgemをインストールすることができる。
Gemfileに記述され、インストールしたgemはGemFile.lockファイルとして保存する。
ちなみにrailsもbundlerによって管理されている。
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")
autherがscopeメソッドとして定義されてる。
この時、もし著者のtanakaさんの本が存在しない場合、Book.allと同じ挙動を起こしてしまう。
ActiveRecord::Enum(列挙型)
class Book < ApplicationRecord
enum sales_status: {
reservation: 0, # 予約受付
now_on_sale: 1, # 発売中
end_of_print: 2, # 販売終了
}
# 略
end
上記のようにenumを定義した後、bookをsaveする際、book.sales_statusにはシンボルで:now_on_saleと入れても、数値で1で入れても、文字列で"now_on_sales"と入れても、返却されるBookインスタンスのsales_statusには文字列のnow_on_saleが表示される。
また、enumに定義されてない値を入れようとすると、エラーが発生する。
利用できるようになるインスタンスメソッド
さらに、enumを使って列挙型を定義すると新たなメソッドが使用できるようになる。
例えば、book.now_on_sale? → true か false
他にもbook.sales_status_before_type_castでbook.sales_statusがnow_on_saleの場合、1が返却される。
利用できるようになるクラスメソッド
クラスメソッドとしてもenumで定義したカラム名の複数形のメソッドを使える。
Book.sales_statuses → {"reservation"=>0, "now_on_sale"=>1, "end_of_print"=>2}
scopeも新たに使えるようになる。
Book.now_on_saleでsales_statusが1のレコードを検索、取得してくれる。
Discussion