テクノロジー

2018年12月28日

ActiveRecord01

ActiveRecordのメソッド 取得系を徹底分析

AcitveRecordの取得系メソッドとは

まず、ActiveRecordのメソッドとは「実行すると一緒にSQLが走るメソッド」のことを指します。(詳しくはRailsメソッド分類をご覧ください)
その中でもさらに以下2つに分類することができます。

  1. DBからレコードを取ってくる「取得系」
  2. 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の保存・削除系メソッド)を学んでいきましょう。

ダイビックのことをもっと知ってみませんか?