1
2

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-08-10

はじめに

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

ActiveRecordとは

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

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

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

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

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

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

オーソドックスなメソッド

以下、よく使うメソッドを記述します。

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

7つのアクションとActiveRecordについて

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

.
.
省略
.
.

  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アクション

def index
  @tweets = Tweet.all
end

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

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

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

newアクション

def new
  @tweet = Tweet.new
end

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

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

createアクション

def create
    @tweet = Tweet.new(tweet_params)

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

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

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

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

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

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

showアクション

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

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

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

editアクション

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

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

end

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

updateアクション

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アクション

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

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

終わりに

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

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

明日も頑張ります!!

1
2
2

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
2