[Rails]７つのアクションとActiveRecordについて

# はじめに
本記事では、ActiveRecordについて記述しております。
コントローラーのアクション内で記述しているメソッド(all,find...etc)を
`なんとなく`記述していること状況を無くすため改めてアウトプットします。

# ActiveRecordとは
`モデル`が`テーブル操作`に関して使用できるメソッドです。[以下訂正します。]

```
[訂正]
ActiveRecordは、MVCで言うところのM、つまりモデルに相当するものであり、ビジネスデータとビジネスロジックを表すシステムの階層です。

また、モデルがテーブル操作に関して使用できるメソッドではなく、「メソッドの総称」になります。

@koki_73 さん　ありがとうございます！
```

テーブルに情報を取得したり、保存したりするために使用することができます。
記述自体は`コントローラー`ですが、
モデルがテーブルに対してどのようなことを実行するのかを実行するのかを指定するものになります。

また、ActiveRecordはたくさんあります。
一つ一つどのような意味を持つのか理解をしなければ、意味が違うコードになってしまいますので、注意です。

## オーソドックスなメソッド
以下、よく使うメソッドを記述します。

|メソッド|意味|
|--------|--------|
|all|テーブルの全てのデータを取得|
|find|テーブルのレコード内の、ある１つのデータを取得|
|new|クラスのインスタンスやレコードを生成|
|save|クラスのインスタンスやレコードを保存|

## ７つのアクションとActiveRecordについて
例文を記述しました。
トップページに画像などを投稿できるアプリケーションとなっております。

```ruby
.
.
省略
.
.

  def index
    @tweets = Tweet.all
  end

  def new
    @tweet = Tweet.new
  end

  def create
    @tweet = Tweet.new(tweet_params)

    if @tweet.save
      redirect_to root_path
    else
      render :new
    end
  end

  def show
    @tweet = Tweet.find(params[:id])
  end

  def edit
    @tweet = Tweet.find(params[:id])

    if current_user == @tweet.user
      render :edit
    else
      redirect_to root_path
    end

  end

  def update
    @tweet = Tweet.find(params[:id])

    if @tweet.update(tweet_params)
      redirect_to tweet_path
    else
      render :edit
    end
  end

  def destroy
    tweet = Tweet.find(params[:id])
    tweet.destroy
    redirect_to root_path
  end

.
.
省略
.
.
```

### indexアクション

```ruby
def index
  @tweets = Tweet.all
end
```

indexアクションでは、
トップページが表示されているアプリケーションに画像や記事が投稿されていきます。
そのため、ここでは`全てを取得する`という意味合いをこめて`allメソッド`を使用します。

他に、　`orderメソッド`と言われる「全てを取得した上で、並べ替えができるメソッド」を使うケースがあります。

orderメソッド自体に「全てを取得する」という意味があるため、その場合は、`allメソッドは不要`ということになります。

### newアクション

```ruby
def new
  @tweet = Tweet.new
end
```

newアクションに、newメソッドが必要な理由としては、
createアクションで保存するために`空のインスタンスを作成する`必要があるためです。

createアクションで保存するにも保存先がなければならず、その受け皿をnewアクションのnewメソッドで生成するということになります。

### createアクション

```ruby
def create
    @tweet = Tweet.new(tweet_params)

    if @tweet.save
      redirect_to root_path
    else
      render :new
    end
end
```

createアクションでは、
①createメソッドを使用する　②newメソッド+saveメソッド
の２パターンになります。

結論として、newメソッド+saveメソッドでできることを、createメソッド１つで実行することが可能です。

しかし欠点があります。
createメソッドでは、一気に生成（new）し、保存（save）してしまうため、
if文を用いることができません。

汎用性は低いですが、コードを短く記述することができるという点で、メリットになります。

newメソッドを使う理由は、言うまでもなく、
createアクションでは保存するアクションのため、newメソッドです。

### showアクション

```ruby
def show
    @tweet = Tweet.find(params[:id])
end
```

showアクションでは、`find`を用います。
showは詳細画面へ遷移するときに用いるアクションです。

表示するための画像や記事の詳細を１つ取得して、詳細を確認することため、
`find`になります。

### editアクション

```ruby
def edit
    @tweet = Tweet.find(params[:id])

    if current_user == @tweet.user
      render :edit
    else
      redirect_to root_path
    end

end
```

editアクションも、showと同じような理由から`find`になります。
１つの画像や記事を編集する、という点から`find`です。

### updateアクション

```ruby
def update
    @tweet = Tweet.find(params[:id])

    if @tweet.update(tweet_params)
      redirect_to tweet_path
    else
      render :edit
    end
end
```

updateアクションも、editからの流れで、`find`です。

### destroyアクション

```ruby
def destroy
    tweet = Tweet.find(params[:id])
    tweet.destroy
    redirect_to root_path
¥end
```

destroyアクションも同様です。
いくつかを取得して削除することから`find`です。
また、destroyアクションでは、
`削除する`ためのメソッド`destroyメソッド`が必要になります。


# 終わりに
考えてみれば、意外と簡単に理解できるかと思います。
私自身は、`なんとなく`の理解のまま進んでいたことから、
ActiveRecordメソッドを記述するたびに、不安な気持ちになっておりました。

これからも自分では気が付いていない`なんとなく`を探し、より深い理解をしていきます。

明日も頑張ります！！