find, find_by, where 〜ActiveRecord::Relationとクエリインターフェース〜
find
- idを引数にとり、マッチした一件を返す
- 例外を起こす
find_by
- キーと値を引数にとり、マッチした最初のレコードを返す
- nilを返す(find_by!は例外を起こす)
where
- キーと値を引数にとり、マッチしたレコードのコレクション(ActiveRecord::Relationのインスタンス)を返す
- 空のActiveRecord::Relationインスタンスを返す
ActiveRecord::Relationとクエリインターフェース
ActiveRecord::Relationは、ActiveRecordのクエリインターフェイスによる操作結果をオブジェクトとして表現したもの。
- ActiveRecordに対してクエリインターフェースが呼ばれるとActiveRecord::Relationのインスタンスが生成され、どのようなSQLが発行されるかの情報が更新されていく
- クエリインターフェースがチェーンされるたびに情報が蓄積していく
- 実際にデータが必要になった時点で、蓄積された情報をもとにSQLを発行し、データを取得する
このような設計になっていることにより、複雑な検索条件をメソッドチェーンで簡潔に記述できるし、必要以上にデータベースとの通信が発生するのを抑制できる。また、ActiveRecord::Relationは配列と同様のインターフェースを持っているため、SQLの実行結果を普通の配列と同じ感覚で使うことができる。
クエリインターフェースとSQLの対応関係
メソッド - SQL select - SELECT where - WHERE limit - LIMIT offset - OFFSET order - ORDER BY group - GROUP BY joins - INNER JOIN left_outer_join - LEFT OUTER JOIN
scope
よく利用する検索条件に名前をつけてひとまとめにしたもの。
- クエリの再利用性が上がる
- 可読性が向上する
条件がマッチしない場合は必ず空のActiveRecord::Relationインスタンスを返すことに注意。