はじめに
本記事では、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メソッドを記述するたびに、不安な気持ちになっておりました。
これからも自分では気が付いていないなんとなく
を探し、より深い理解をしていきます。
明日も頑張ります!!