【Rails】条件に応じてデータを取得する

#複雑な条件でデータを抽出する
テーブルのデータをより複雑な条件で絞って取得するメソッドをまとめる。

##条件式を使用する
###基本的な条件式
テーブルのデータを条件式で絞って取得する場合。
データを受け取りたいテーブルに紐づくモデルに対して、
<font color="Red">**モデル名.where(カラム名: '値')**</font>

```ruby:
#例 artistカラムの値が'ももいろクローバーZ' のレコードを取得
@discography = Discography.where(artist: 'ももいろクローバーZ')

#例 artistカラムの値が'ももいろクローバーZ'かつreleased_dateが'2011-07-27' のレコードを取得
@discography = Discography.where(artist: 'ももいろクローバーZ', released_date: '2011-07-27')
```

###not / or メソッド
<font color="Red">**モデル名.where.not(カラム名: '値')**</font>
<font color="Red">**モデル名.where(カラム名: '値').or(モデル名.where(カラム名: '値'))**</font>

```ruby:
#例 artistカラムの値が'ももいろクローバーZ' ではないレコードを取得
@discography = Discography.where.not(artist: 'ももいろクローバーZ')

#例 artistカラムの値が'百田夏菜子' または released_dateの値が'2010-11-10'のレコードを取得
@discography = Discography.where(artist: '百田夏菜子').or(Discography.where(released_date: '2010-11-10'))
```
ちなみに、andメソッドはないみたいです笑

## 最初/最後のレコード
<font color="Red">**モデル名.first**</font>
<font color="Red">**モデル名.last**</font>

```ruby:
#例 Discographyテーブルの1番最初のレコードを取得
@discography = Discography.first

#例 Discographyテーブルの先頭から3件のレコードを取得
@discography = Discography.first(3)

#例 Discographyテーブルの1番末尾から4件のレコードを取得
@discography = Discography.last(4)
```
## カラムを指定する
指定したカラムのみのデータを取得する場合。
<font color="Red">**モデル名.select("カラム名")**</font>

```ruby
#例 Discographyテーブルのnameカラムのデータを取得
@discography = Discography.select('name')
@discography = Discography.select(:name)

#例 Discographyテーブルのnameカラムとartistカラムのデータを取得
@discography = Discography.select('name', 'artist')
@discography = Discography.select(:name, :artist)
```
### 指定したカラムの配列を取得
<font color="Red">**モデル名.pluck("カラム名")**</font>

- selectメソッドを使用した際
<img width="1012" alt="スクリーンショット 2018-09-07 21.54.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/180127/26fc2f92-1a46-1c68-3c90-fd080ef1e09e.png">
<img width="142" alt="スクリーンショット 2018-09-07 21.55.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/180127/d1c62c87-bd06-e5af-0892-19d601abe76c.png">

- pluckメソッドを使用した際
<img width="1002" alt="スクリーンショット 2018-09-07 21.55.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/180127/de2f910e-70da-a33a-3c14-09c8bceb5ee5.png">
<img width="243" alt="スクリーンショット 2018-09-07 21.56.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/180127/99ae8ac6-da82-926f-97b0-917d3b310299.png">



##レコード順序の並べ替え
順序づけの基準となるカラム名を指定する。
<font color="Red">**モデル名.order('カラム名')**</font>

```ruby
#例 nameカラムの中身を基準に順序を並べ替えて取得
@discography = Discography.order('name')
@discography = Discography.order('name ASC')
@discography = Discography.order(name: :asc)

#例 nameカラムの中身を基準に逆順序を並べ替えて取得
@discography = Discography.order('name DESC')
@discography = Discography.order(name: :desc)
```

## レコードの個数を指定する
limitメソッドとoffsetメソッドを使用。
<font color="Red">**モデル名.limit( n )**</font>
<font color="Red">**モデル名.limit( n ).offset( m )**</font>

```ruby: 
#先頭から3つのレコードを取得
@discography = Discography.limit(3)

#5つ目から3つのレコードを取得
@discography = Discography.limit(3).offset(4)
```
##グループ化する
groupメソッドを使用。group化したいカラム名を入れる。
<font color="Red">**モデル名.group(カラム名)**</font>

```ruby: 
#artistカラムでグループ化。
@discography = Discography.group(:artist)
```
allメソッドで取得した結果を出力すると以下(画像は途中で切れてる)のようになるところ、
<img width="854" alt="スクリーンショット 2018-09-07 21.02.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/180127/21f680b0-96a9-276b-769f-bc7eb3dc1c8b.png">
artistカラムでグループ化して取得した結果が以下。
<img width="737" alt="スクリーンショット 2018-09-07 21.02.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/180127/04414f55-d970-2e42-388e-d55c72398c57.png">

サンプルのテーブルは余裕ができたらもっと誰でも理解しやすいものに置き換えますね、すみません...

##空をセット
<font color="Red">**モデル名.none**</font>

##破壊的メソッド
オブジェクトの値そのものを変えてくれるもの。
where!, select!, order! など今まで紹介したようなメソッド名に "!" をつける。
効果をわかりやすく紹介したものを下記に示す。

```ruby: 
#通常のメソッドで記述すると長くなるが
@discography = Discography.all
@discography = @discography.where(artist: 'ももいろクローバーZ')

#破壊的メソッドを使うと少しすっきり書ける。結果は上と同じになる。
@discography = Discography.all
@discography.where!(artist: 'ももいろクローバーZ')
```
##その他tips
存在・個数・平均・最大・最小・合計を求めた例を以下に示す。

```ruby: 
#存在するかどうかをfalse/trueで代入
@exist = Discography.where(released_date: '2011-03-10').exists?

#個数
@exist = Discography.where(released_date: '2011-03-09').count

#平均 (idを平均することはないと思うけど。。)
@exist = Discography.where(released_date: '2011-03-09').average(:id)

#最小
@exist = Discography.where(released_date: '2011-03-09').minimum(:id)

#最大
@exist = Discography.where(released_date: '2011-03-09').maximum(:id)

#合計
@exist = Discography.where(released_date: '2011-03-09').sum(:id)
```