find, find_by, where 〜ActiveRecord::Relationとクエリインターフェース〜

find

  • idを引数にとり、マッチした一件を返す
  • 例外を起こす

find_by

  • キーと値を引数にとり、マッチした最初のレコードを返す
  • nilを返す(find_by!は例外を起こす)

where

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インスタンスを返すことに注意。