パーフェクト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