テクノロジー
2018年12月28日ActiveRecord01
ActiveRecordのメソッド 取得系を徹底分析
AcitveRecordの取得系メソッドとは
まず、ActiveRecordのメソッドとは「実行すると一緒にSQLが走るメソッド」のことを指します。(詳しくはRailsメソッド分類をご覧ください)
その中でもさらに以下2つに分類することができます。
- DBからレコードを取ってくる「取得系」
- DBへ値をcreate・update・destroyを行う「保存/削除系」
今回は主な「取得系」について徹底分析していきます。
Railsコンソールを用いて実際に手を動かしながら一緒に確認しましょう。
主な「取得系」メソッド
allメソッド
これはテーブルに存在するレコード全てを配列で取得するメソッドです。
Blog.all
例えばこのようにBlog.allとすることでblogsテーブルから全てのレコードを取得することができます。
Blog Load (79.5ms) SELECT "blogs".* FROM "blogs"
=> [#<Blog:0x007fec8640d740
id: 3,
title: "aaaaa",
content: "bbbbb",
created_at: Sat, 22 Oct 2016 05:18:34 UTC +00:00,
updated_at: Sat, 22 Oct 2016 05:18:34 UTC +00:00>,
#<Blog:0x007fec8640d600
id: 5,
title: "eeeee",
content: "fffff",
created_at: Fri, 28 Oct 2016 01:10:23 UTC +00:00,
updated_at: Fri, 28 Oct 2016 01:10:23 UTC +00:00>]
たとえレコードがひとつしかなくても、allメソッドは配列で取得します。
findメソッド
これは指定したidをキーにして、レコードを取得するメソッドです。
このメソッドは特徴的で、柔軟性を持っています。
例えば以下のようにIDをひとつだけ指定します。
Blog.find(1)
するとブログのレコードがひとつ取得できます。
Blog Load (34.2ms) SELECT "blogs".* FROM "blogs" WHERE "blogs"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]]
=> #<Blog:0x007fec8633f6d8
id: 1,
title: "aaaaa",
content: "bbbbb",
created_at: Sat, 22 Oct 2016 05:18:34 UTC +00:00,
updated_at: Sat, 22 Oct 2016 05:18:34 UTC +00:00>
しかし、以下のようにIDを複数指定します。
Blog.find([3, 5])
すると2つのレコードが配列で取得できます。
Blog Load (28.2ms) SELECT "blogs".* FROM "blogs" WHERE "blogs"."id" IN (3, 5)
=> [#<Blog:0x007fec86294be8
id: 3,
title: "aaaaa",
content: "bbbbb",
created_at: Sat, 22 Oct 2016 05:18:34 UTC +00:00,
updated_at: Sat, 22 Oct 2016 05:18:34 UTC +00:00>,
#<Blog:0x007fec86294aa8
id: 5,
title: "ggggg",
content: "hhhhh",
created_at: Fri, 28 Oct 2016 01:10:23 UTC +00:00,
updated_at: Fri, 28 Oct 2016 01:10:23 UTC +00:00>]
find_byメソッド
findメソッドはIDをキーにして該当するレコードを取得するメソッドでした。find_byはキーと値を自由に決めることができます。
Blog.find_by(title: 'aaaaa')
このようにtitleをキーにして「aaaaa」に一致したレコードを取得します。
Blog Load (0.9ms) SELECT "blogs".* FROM "blogs" WHERE "blogs"."title" = $1 LIMIT $2 [["title", "aaaaa"], ["LIMIT", 1]]
=> #<Blog:0x007fec810dfbe0
id: 3,
title: "aaaaa",
content: "bbbbb",
created_at: Sat, 22 Oct 2016 05:18:34 UTC +00:00,
updated_at: Sat, 22 Oct 2016 05:18:34 UTC +00:00>
さてfindメソッドは以下のようにキーを複数指定すれば、複数のレコードを配列で取得することができました。
Blog.find(3, 5)
しかし、find_byメソッドは必ずひとつのレコードしか取得できないような仕様になっています。もし、titleというカラムに「aaaaa」という値が含まれているレコードが複数あった時には、IDが一番若いレコードが取得できます。
whereメソッド
これは指定したキーに一致したレコード全てを配列で取得するメソッドです。
Blog.where(title: 'aaaaa')
例えばtitleが「aaaaa」のレコードはこのように記述でき、以下のように取得することができます。
Blog Load (0.5ms) SELECT "blogs".* FROM "blogs" WHERE "blogs"."title" = $1 [["title", "aaaaa"]]
=> [#<Blog:0x007fec860c8828
id: 3,
title: "aaaaa",
content: "bbbbb",
created_at: Sat, 22 Oct 2016 05:18:34 UTC +00:00,
updated_at: Sat, 22 Oct 2016 05:18:34 UTC +00:00>,
#<Blog:0x007fec860c8670
id: 6,
title: "aaaaa",
content: "hoge",
created_at: Fri, 28 Oct 2016 02:35:01 UTC +00:00,
updated_at: Fri, 28 Oct 2016 02:35:01 UTC +00:00>]
こちらもallメソッドと同様にレコードがひとつだとしても配列で取得します。
orderメソッド
これはレコードを並び替えて取得するメソッドです。以下のように使用します。
Blog.order(title: :asc)
「asc」とは昇順というオプションです。降順に並び替えたければ、「desc」というオプションを使用します。
さらにwhereメソッドやallメソッドと組み合わせて使うこともできます。頻度はこちらの方が多いので覚えておきましょう。
Blog.where(title: 'aaaaa').order(content: :asc)
Blog.all(created_at: :desc)
いかがでしたでしょうか。これらのメソッドは開発していたら頻繁に出てくるので、実際にコンソールで動かしてみてどんなメソッドかを把握しておきましょう。
次回は(AcitveRecordの保存・削除系メソッド)を学んでいきましょう。