皆さんは、findやfind_byを使い分けることはできていますか?
なんとなくでfindやfind_byをcontrollerで使っている人も多いかなと思います。
自分も使い分ける事ができておらず、つい最近まで、以下の画像の様にcontrollerに記載していました。
しかし、エンジニアの方にちゃんと使い分けた方がいいよとアドバイスを頂いたので、そのアドバイスを踏まえた上で、実際に作っていく際、意識した方がいいfindやfind_byの特長について、以下で述べていこうと思います。
find、find_byの大きな違い
最も大きな違いは、find_byは、nilを返すという点です。
さっきの画像のように、idを用いてデータを取ってくることは多いと思います。
その時、
@micropost1 = Micropost.find_by(id: params[:id])
@micropost2 = Micropost.find(id: params[:id])
の2つの書き方ができます。
データがちゃんとある際、どちらもちゃんとデータを引っ張ってくる事ができますが、データがなかった際、対応が違ってきます。
@micropost1では、データが無ければ、エラーが返されますが、
@micropost2では、nilが返されます。
つまり、find_byだと、データがなかった際、@micropost2 = nilのまま、viewまでプロセスが走ってしまいます。
しかし、findを使えば、nilではなく、エラーが返されるので、viewまでプロセスが走ることはありません。
したがって、特段の理由がないのなら、show actionなどで、idでデータを引っ張ってくる際は、findを使う事がおすすめです。
そして、findでは、idでしか引っ張ってこれないという点も着目ポイントだと思います。id以外でデータを引っ張ってきたい時は、find_byを使いましょう!