参考書を読んだメモ : 独習Ruby on Rails 5章
独習Ruby on Rails
Active Record
- モデルを操作してデータベースとやりとりを行う
- モデルに実装される機能
モデルの作成
- モデルの作成手順
- 対象となるモデルを生成する
- 2.マイグレーションを行い、モデルに対応するテーブルを作成する
- 3.モデルの基本の検証を行う
- 4.動作検証に基づいて、モデルに必要な機能を追加する
マイグレーションとシード
マイグレーション
- マイグレーションとは、マイグレーションファイルを使って、Rails側からデータベースを作成更新する作業
- rails db:migrate
- rails db:version
- 実行済みのマイグレーションのバージョンを表示
- rails db:migrate:status
- rails db:migrate:reset
- rails db:setup
- データベースの作成(db:create)、スキーマからのテーブル作成(db:schema:load)、初期データの登録(db:seed)を一連の作業として行う
- rails db:reset
- rails db:migrate:redo [STEP]
- rails db:schema:load
- 現在のスキーマファイルからデータベースを作成する
- データベースは削除され作り直される
- rails db:drop
- 現在のデータベースを全て削除する
- db:reset、db:migrate:reset の際にも自動で実行される
マイグレーション名の付け方
- create_テーブル名
- 新規作成
- addカラム名to_テーブル名
- カラム追加
- removeカラム名from_テーブル名
- カラム削除
- create_join_tableモデル名モデル名
- habtm(has_belongs_to_many) 多対多の関係の仲介テーブル
マイグレーションのメソッド
- change
- テーブルの作成、カラムの追加、削除を行う場合に使用する
- up/down
- rollbackが働くよう、スキーマに対する変更/戻しを記述する。up(変更記述)/down(戻し記述)
- reversible
- change だけでロールバックを判定できないときにup/downを使用して変更と戻しの処理をreversibleの中に取り込み、どちらの向きの変更処理も常に同じ方向での処理ができるようにする。
- revert
シード
- 初期データを入れる
- rails db:seed
- seeds.rb に記述したデータがデータベースに登録される
- シード機能で登録するデータはモデルを通して保存されるため、バリデーションによる検証を行う
CRUD操作と標準装備のメソッド
- CRUD 操作とは
- create データリソースの作成
- read データリソースの読み出し
- update データリソースの更新
- delete データリソースの削除
- モデルクラス(インスタンス)操作メソッドとしてテーブルのデータリソースに対するCRUD操作を行う
Create
- save
- create
- newとsaveを一連で行うメソッド
- create 実行時にバリデーションでエラーが発生した場合、再処理を行う必要があるが、createメソッドではこのエラーをfalseとして評価できない
Read
- find(id)
- find_by(条件)
- 指定された(属性: 値)の組み合わせに一致するデータを取得し、対応するモデルのインスタンスを生成する
- 取得するデータは常に1件のみで、データが複数ある場合最初に一致するデータのみを生成する
- first
- last
- 最後のデータを取得
- first と同じように引数を渡せる
- take
- all
- 全データ取得
- where
- テーブルから指定された条件を満たす全データを取得する
- all と where は array ではなく ActiveRecord::Relationクラスで返す
- find_by_sql(SQL文)
- sql文を用いてデータを取得する
- Arrayで返す
- ORMの機能を無視してまで使う理由がなければ使わない方が良い
Update
- update
- update_all
- 指定された属性の値に従って、テーブル上のモデルに相当するデータの値を全て更新する
- Data.where(attribute1: value1).update_all(attribute2: value2)
- 指定された属性の値に従って、テーブル上のモデルに相当するデータの値を全て更新する
Delete
- destroy
- データをインスタンス貸してから削除する
- クラスメソッドからも使える
- destroy_all
- 全て削除
- delete
- インスタンスかせずに直接削除する
- コールバックは働かない
delete_al
- delete の all 版
create/save/updateメソッドは、テーブル操作の前にバリデーションを実装できる
- バリデーションに失敗した場合はロールバックを行い、createメソッドはインスタンスを、save/update は false を返す
- エラーを返したい場合は、create!, save!, update! を用いる
- where ではあいまい検索も可能
- User.where('name like ?', '%太郎%') # 〜〜太郎さんを取得できる
- where で否定を行うときは where.not(条件)
- where は or で連結することができる
インスタンス配列の取得を支援するメソッド
- select(属性)
- limit/offset
- limit は取得データの数を指定する
- offset は取得開始位置を指定する
- 組み合わせることで指定された位置から位置までを対象にできる
- order
- 指定された属性の値に従って並び替える
- asc, desc (昇順, 降順)を指定できる
- group
- 指定された属性でグループ化する
- User.group(:address).count => {"北海道"=> 1, "東京都"=> 5, "大阪府"=> 2}
- having
- groupメソッドに対する条件として指定できる
- User.group(:address).having(address: "東京都").count => {"東京都" => 5}
- unscope/only
- unscope は上位メソッドのうち指定したものを取り除く
- only は上位メソッドのうち指定したもののみを有効にする
- reverse_order
- order を逆順にする
- reorder
- モデルに設定した並び順を書き換える
- User.reorder('create_at')
- rewire
- 上位の whereメソッドの同じ属性条件を書き換える
- none
- クラス、インスタンス配列に対して使い、ActiveRecord::Relation の [] を返す
その他便利なメソッド
- pluck
- 属性配列を取得する軽量なメソッド
- 必要な属性を指定して条件を満たす属性のみの配列を作成することができる
- User.pluck(:name, :email) # 名前とメールアドレスのみの配列
- 重複を一意にする場合はUser.distinct.pluck(:name)
- ids
- id 属性だけの配列を取得する
- count
- データ総数を取得する
- sum
- 指定された属性値の合計を取得する
- average
- 指定された属性値の平均を取得する
- 平均値の値はto_f/to_iで変換する必要がある
- minimum
- 属性値の最小値を取得する
- maximum
- 属性の最大値を取得する