where系ActiveRecord備忘録

where系ActiveRecord備忘録

 where系のActiveRecordメソッドとその引数。これさえあればとりあえず何とかなる。そもそもwhereさえあらばなんとでもなるともいう。
 ActiveRecordに対応するSQLで言えば

データベースの操作とは,「取得(選択)」,「挿入」,「更新」,「削除」の4つが基本であり,これらを表すSQLの命令は,それぞれSELECT,INSERT,UPDATE,DELETEとなります。
忙しいあなたのためのSQL入門 第2回(1)

のうち取得(選択)のところにあたる。ただしfind_by_sqlとかのSQL直書き系のメソッドは対象外。

where

 条件指定複数検索用。
 ハッシュか文字列で受け取った引数を条件として検索をする。結果は集合として配列で来る。

# ハッシュ系
records = RecordObject.where(id: 10)
records = RecordObject.where({id: 10, name: "国民年金基金"})
# ※{}で囲まれていようとなかろうとハッシュはハッシュ。
records = RecordObject.where(myhome: 1..3)

# 文字列系
records = RecordObject.where("age > ?", 100)
# ※正確には要素数2の配列を与えているのだが、まあ直感的にはprintfみたいなものなので文字列ということで。下も同様。
records = RecordObject.where("income > :serious_income_bottom AND income < :serious_income_top", {serious_incom_bottom: 100, serious_income_top: 100000000})

結果は配列で来る(上例ではrecordsが配列になる)ので単体のレコードをあらわすオブジェクトにアクセスしたい場合は添え字で指定するかeachなどをやる必要がある。

find

 id指定単体検索用。
 整数で受け取った引数を条件として検索をする。結果は単体オブジェクトとしてくる。条件に二つ以上適合する場合は最初に見つけたやつが来る。

record = RecordObject.find(59)

whereで書くと

record = RecordObject.where(id: 59)[0]
record = RecordObject.where("id = ?", 59)[0]

という感じ。

find_by

 id以外の要素指定単体検索用。
 何を検索するかをハッシュで指定する。idで検索したい場合は入力文字数の無駄なのでfindを使った方が良い。

record = RecordObject.find_by(name: "国民健康保険")

whereでは

record = RecordObject.where(name: "国民健康保険")[0]

となる。

all

 配列で全部。

records = RecordObject.all
records = RecordObject.where(nil)

first

 単体で最初(idが最小)のやつ。

record = RecordObject.first
record = RecordObject.where(nil).sorted_by{ |e| e.id }[0]

last

 単体で最後(idが最大)のやつ。

record = RecordObject.first
record = RecordObject.where(nil).sorted_by{ |e| e.id }[-1]

take

 単体で任意のやつ。具体的には、記録されているものの一番上のやつ。

record = RecordObject.take
record = RecordObject.where(nil)[0]

not

 whereの後ろにつけて、条件を論理反転。

records = RecordObject.where.not("id < 74")
records = RecordObject.where("id >= 74")

参考文献