参考書を読んだメモ : 独習Ruby on Rails 5章

独習Ruby on Rails

Active Record

  • モデルを操作してデータベースとやりとりを行う
  • モデルに実装される機能
    • データリソースのライフサイクル(新規登録〜削除)を実現する機能
      • CRUD操作
      • コールバック
    • データリソースの個々の属性の正当性を保証し、正常に保つ機能(バリデーション)
      • 外部から入力される値の妥当性の検証
    • データリソースの処理の対象範囲を制御する機能
      • スコープ
    • モデル同士の相互の関係を適切に保つ機能
      • アソシエーション
    • データリソース内の整合性を適切に保つ機能
      • ロック
    • データリソースをよりスマートに管理する機能
      • attributes
      • API
      • 仮想的な属性

モデルの作成

  • モデルの作成手順
      1. 対象となるモデルを生成する
    • 2.マイグレーションを行い、モデルに対応するテーブルを作成する
    • 3.モデルの基本の検証を行う
    • 4.動作検証に基づいて、モデルに必要な機能を追加する

マイグレーションとシード

マイグレーション

マイグレーション名の付け方

  • 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)
    • 指定されたidを持つデータを取得し、対応するモデルのインスタンスを生成する
    • id を複数指定した場合、インスタンスの配列を返す
    • idがnilや、見つからない場合はエラーを返す
  • find_by(条件)
    • 指定された(属性: 値)の組み合わせに一致するデータを取得し、対応するモデルのインスタンスを生成する
    • 取得するデータは常に1件のみで、データが複数ある場合最初に一致するデータのみを生成する
  • first
    • テーブルに存在する先頭のデータを取得し、対応するモデルのインスタンスを生成する
    • second, third もある
    • 引数で数値を与えるとその数の分のデータのインスタンスの配列を返す
  • last
    • 最後のデータを取得
    • first と同じように引数を渡せる
  • take
    • ランダムにデータを取得し、対応するモデルのインスタンスを生成する
    • データがない場合はnil
    • エラーが欲しい場合はtake!
    • 引数を指定すると数だけランダムに取得
  • all
    • 全データ取得
  • where
    • テーブルから指定された条件を満たす全データを取得する
    • all と where は array ではなく ActiveRecord::Relationクラスで返す
  • find_by_sql(SQL文)
    • sql文を用いてデータを取得する
    • Arrayで返す
    • ORMの機能を無視してまで使う理由がなければ使わない方が良い

Update

  • update
    • インスタンスメソッドとして
      • 属性を指定して値を更新することができる
    • クラスメソッド
      • id を渡すことでクラスメソッドから直接更新することができる(ex, Data.update(1, [attribute: value]) id1のデータを更新している)
  • 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 で連結することができる
    • User.where(address: '東京都').or(User.where(address: '大阪府')) と User.where(address: ['東京都', '大阪府']) は同じ

インスタンス配列の取得を支援するメソッド

  • select(属性)
    • モデルの属性の中で取得したい属性を支持して、対象のインスタンス配列を作成する
    • 複数の属性を指示できる
    • find メソッドなどがテーブルの行単位(データリソース単位)で取得するのに対し、select はテーブルの列単位(属性列)で取得するメソッド
    • 重複する値を持つオブジェクトを一意にする場合 distinct メソッドを付加することができる
    • ex. ユーザーモデルの名前と誕生日のみのインスタンス配列を取得する場合
      • User.select(:name, :birthday)
  • 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

その他便利なメソッド

  • pluck
    • 属性配列を取得する軽量なメソッド
    • 必要な属性を指定して条件を満たす属性のみの配列を作成することができる
    • User.pluck(:name, :email) # 名前とメールアドレスのみの配列
    • 重複を一意にする場合はUser.distinct.pluck(:name)
  • ids
    • id 属性だけの配列を取得する
  • count
    • データ総数を取得する
  • sum
    • 指定された属性値の合計を取得する
  • average
    • 指定された属性値の平均を取得する
    • 平均値の値はto_f/to_iで変換する必要がある
  • minimum
    • 属性値の最小値を取得する
  • maximum
    • 属性の最大値を取得する