light log

学んだこととか

ActiveRecordのSELECT系メソッド

はじめに

今日はあんまり進まなかったけど、とりあえず復習として読んだところのメモだけしておく。

読んでる本はこれ。

Ruby on Rails 4 アプリケーションプログラミング

Ruby on Rails 4 アプリケーションプログラミング

今日から5章の「モデル開発」に入ってる。

このうち、

5.1 データ取得の基本 - findメソッド
5.2 より複雑な条件での検索を行う - クエリメソッド
5.3 データ取得のためのその他のメソッド

について簡単におさらいする。

findメソッド

find(keys)

主キー列で検索する。

引数のkeysを配列にして複数値の検索も可能。

find_by(key: value)

keyで指定した列がvalueで指定した値に合致するレコードを1件取得する。

keyvalueのペアを複数指定するとAND検索の要領になる。

クエリメソッド

クエリメソッドfindfind_byと異なり、DBアクセスが必要になるまで遅延される。これにより、メソッドチェーンで条件を追加していくことができる。

where(exp)

expで指定した条件に当てはまるレコードを検索する。

条件は、具体的な値を直接指定するほか、RangeオブジェクトでSQLのBETWEEN相当の条件を指定したり、配列を使ってSQLのIN相当の指定をしたりできる。

また、文字列で条件を直接指定する方法も提供されている。この場合、プレースホルダを使った表現にすることで可読性が増し、SQLインジェクション対策にもなる。

not

whereと組み合わせることで、否定条件を表現できる。

order(key: :asc or :desc)

指定した列でソートする。ソート順が:ascの場合は省略可。

reorder

手前でorderによって指定されているソート順を無視して新たにソートする。

distinct

重複したレコードを除去する。

limit

最大取得レコード数を指定する。

offset

limitと組み合わせて使用し、取得するレコードの開始レコード位置を指定する。

first/last

先頭/末尾のレコードを取得する。

group(key)

keyで指定した列でグループ化する。

having(exp)

groupで集計した結果に対して、絞り込み条件を指定する。

where!

whereの破壊的バージョン。

unscope

これまでに指定された条件を除去する。

none

空の結果を返す。

その他のメソッド

pluck(col)

指定した列を配列として取得する。

exists?

レコードの存在を確認する。

scope(モデルのクラス定義で使用)

よく利用する条件を、後で使えるように名前付けする。

default_scope(モデルのクラス定義で使用)

デフォルトの条件を指定する。

count

検索結果のレコード数を取得する。

average/minimum/maximum/sum

レコードの平均/最小/最大/合計を取得する。

find_by_sql

生のSQLを指定する。

まとめ

基本的に、SQLに対応したメソッドになっているので、特に難しいところはない。

にしても進捗が少なすぎるし、勉強したことをアウトプットしていくことが下手すぎる。。精進せねば。