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")
参考文献
- 矢沢久雄(2002)「忙しいあなたのためのSQL入門」, http://itpro.nikkeibp.co.jp/article/COLUMN/20061213/256848/ 2017年12月10日閲覧
- 「Active Record クエリインターフェイス」, https://railsguides.jp/active_record_querying.html