LoginSignup
1
0

More than 1 year has passed since last update.

データベース検索data取得

Last updated at Posted at 2021-05-17

このようなテーブルがあるとします。

id name email create_at update_at password
10 kasandra hiphop@glove.com 2021-05-17 23:00 2021-05-18 23:18 hjkl
11 Andrew terrace@earth.com 2021-05-17 23:11 2021-05-18 23:20 uioo
12 James beach@boat.com 2021-23:17 2021 05-18-23:23 wery

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

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

@user = User.find(11)Copy

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

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

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

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

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

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

@users = User.where(created_at:  "2021-05-17..")Copy

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

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

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

④order

カラムの順番を変更するメソッド
これは簡単ですね。例えば、上の三つの順序を逆にしたものを表示したいとすると

@users = User.order("id DESC")Copy
idを降順に並び替えると行った感じのことができてます。

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

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

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

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

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

@user = User.limit(2)Copy

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

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

⑧で具体例をあげます。

⑧average、sum、minimum、maximum:演算メソッド(平均、加、最小、最大)

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

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

name subject score
hoge math 40
hoge english 50
foobar math 90
foobar english 10

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

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

nameでグループ化して、scoreを足しています。
なので、@userには{“hoge” => 90, “foobar” => 100}
このようなハッシュで値を取得できています。

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

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

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

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

参考:マクロロ(macroro)さん

https://macroro.com/rails-date-get/

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0