このようなテーブルがあるとします。
id | name | 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)さん