Railsでのデータ取得の基本

今回はRailsでデータ取得しようということで、DBに保存されているデータを取得し、viewに出力するところまで解説していこうと思います。まずは、Railsにおいて簡単にデータベースの扱いの全体像を掴んでいきましょう。

データの取得についての概要

最初にRailsを用いたアプリケーションでのデータ取得の大まかな概要を少し説明します。

そもそもRailsに限った話ではないですが、データベースに保存されているデータを取得してページに表示させるのは、ウェブアプリケーションを扱っていくエンジニアにとってよくある状況です。

例えばアマゾンのようなECサイトの場合、ユーザーがカートに商品を追加した際、その追加した商品をデータベースに保存します。そして、支払いの最終確認画面などで実際に購入する商品の一覧を表示するなどです。

しかし、アマゾンのようなサイトで買い物をするユーザーは世界中にたくさんいます。そのような場合、「誰が」「どのような」買い物をしたかをしっかりとデータベースで管理して、該当のユーザーに正しい購入商品の一覧を表示させなければなりません。

この場合は、ユーザーとカートを紐ずけていれば一発で解決する簡単な話です。

しかし、このような場合はどうでしょう。あなたがアマゾンで買い物をしており、一回カートに入れた後「やっぱり買うのやめよう」と思いカートから出した商品の一覧を取得したいときです。

このような場合、カートテーブルにdeleted_atカラムなどを作り、そのカラムに値が存在するidの商品だけ取得して表示させるなどの処理が必要ですね。

簡単な、取得フローを解説すると

  • コントローラーでインスタンス変数を定義する
  • そのインスタンス変数に該当のモデルから、deleted_atのカラムがnilではないidの商品を代入する
  • viewでインスタンス変数を出力
  • 取得したい条件が複雑になればなるほど、インスタンス変数の定義時にモデルから取得する条件(sql)を複雑にしていくって感じですね。

    よく使うデータを操作するコマンド

    それでは基礎的なデータ取得のコマンドを見ていきましょう。今回は9個のデータを扱うメソッドを簡単に紹介します。

    そして、具体的な例があったほうがわかりやすいので、以下の任意のユーザーカラムの抜粋を用いて説明していきます。

    表示されている内容としては、idが10、11、12のユーザーで、カラムは

    id、name、email、created_at、updated_at、password_digest

    が存在しているテーブルです。

    ①find

    idを検索キーとしてデータを取得するメソッド(複数取得可能)

    id以外のキーでは検索できないので注意です。具体的な使い方は上記ユーザーテーブルのidが11の人のオブジェクトを取得したい時です。

    (オブジェクトとはここでは、idが11の人の行のデータだと思ってください)

    @user = User.find(11)

    これで@userインスタンスにidが11の人のデータが取得されました。引数に(10, 11)としてあげれば配列として、両方のオブジェクトを取得できます。

    ②find_by

    任意の条件(すきなカラム)で値を1件だけ取得するメソッド

    @user = User.find_by(email: "example-9@rails...")

    id、10のレコードが取得できますね。なお、このメソッドは上からみていって最初にマッチした条件(1件)を取得します。

    ③where

    条件を絞り込むメソッド(複数取得する)

    whereメソッドは該当するデータを複数取得します。

    @users = User.where(created_at:  "2018-12-4..")

    @usersでは上記の3つのデータがみられるようになりました。

    ここで、「みられるようになった」という表現をしたのですが、それには理由があり、whereメソッドは値と取得している訳ではなく(オブジェクトとして変数に格納されているわけではなく)ただ、指定した条件で、範囲を絞っただけなので、whereに対して特定のカラムのデータなどを取得することはできません。

    なおwhereは検索キーはid以外になっています。

    ④order

    カラムの順番を変更するメソッド

    これは簡単ですね。例えば、上の三つの順序を逆にしたものを表示したいとすると

    @users = User.order("id DESC")

    idを降順に並び替えると行った感じのことができてます。

    ⑤distinct

    重複しているデータを一つにまとめるメソッド

    簡単に言うと同じカラム内に全く同じデータが存在していた場合に、重複しているデータをまとめてくれるメソッドですね。例えば上のデータの例だと、created_atが全部同じ値ですね。

    @user = User.select("created_at").distinct

    selectは、単にどのカラムか指定してるだけです。このように使うと、@userには2018-12-4 08がのみのデータが格納されます。

    ⑥limit

    取得するデータの数を制限するメソッド

    @user = User.limit(2)

    単純に上から2件データを持ってきてるだけです!

    ⑦group

    カラムの値をグループ化するメソッド

    下記で具体例をあげます。

    ⑧average、sum、minimum、maximum

    演算メソッド(平均、加、最小、最大)

    groupと⑧のメソッドはまとめて説明した方が早いのでまとめます。上記のテーブルだけだと説明しにくいので、新しいテーブルで考えます。

    例えば、ある2人の生徒のテストの点数が保存されているテーブルがあるとします。

    namesubjectscore
    hogemath40
    hogeenglish50
    foobarmath90
    foobarenglish10

    このような場合、hogeとfoobarの二人の2科目の合計を知りたい時、これらのメソッドを組み合わせてこのようにデータを取得することができます。

    @users = User.group(:name).sum(:score)

    こんな感じです。nameでグループ化して、scoreを足しています。

    なので、@userには{“hoge” => 90, “foobar” => 100}

    このようなハッシュで値を取得できています。

    ⑨having

    データベースから取得したデータを元に絞り込む

    再び先ほどの教科のテーブルを例で使うと、

    @user = User.group(:name).having(['SUM(score) >= ?',  50"])

    これは先ほどのハッシュの値を元に、さらに検索条件を絞っています。足した値が50以上のデータなので{hoge、50}が取得されると言うことですね。

    まとめ

    ここにあるメソッドをぼんやり覚えておけば、データを扱う処理を行う際に「そういえばあんなメソッドあったな〜」っと思い出してググったり、書籍で細かい使用を調べればデータ操作について最初のうちは困らないと思います。

    複雑な検索結果を取得したい場合は、これらのメソッドに加えてand、orやnotを複数組み合わせることで、複雑な条件で指定したデータを取得できると思います!

    今回は、railsでのデータ取得に関してでした。技術系の記事を書くとかなり知識が定着するので、プログラミングを勉強している方は業務で学んだ技術や知ってる知識を発信すると良いと思います。

    chrome拡張ツールvimiumを使おう前のページ

    jQueryの基本を学ぼう次のページ

    関連記事

    1. プログラミング

      Dockerとは

      こんにちは、まくロロです。最近インフラ周りに興味が出てきて、今後do…

    2. プログラミング

      Gitとは?Gitの概念を理解しよう

      こんにちは、まくロロです。今回は、Gitの概念を説明していき…

    3. プログラミング

      railsにreactを導入してみよう

      最近、自分で作っているポートフォリオがあるのですが、フロントをオシャ…

    4. プログラミング

      未経験エンジニア学習順序【アプリリリースまで】

      こんにちはまくロロです。今回は、未経験から一人でサービスをリ…

    5. プログラミング

      サーバーの種類について学ぼう

      こんにちはマクロロです。今回はサーバーの種類について簡単に基礎を習得…

    6. プログラミング

      これから伸びる言語Golangを習得しよう。

      こんにちは、まくロロです。私は現在、主にrailsを使用した…

    コメント

    1. この記事へのコメントはありません。

    1. この記事へのトラックバックはありません。

    最近の記事

    PAGE TOP