newとbuildの違い(Ruby on Rails)

f:id:ryoutaku_jo:20190328223438p:plain

【結論】

・new/buildはともに
 モデルオブジェクトを生成するメソッド

・現行バージョン(Rails4系・5系)では
 機能的な違いは無い。

・但し、以前までの慣例として、
 モデルを関連付けしている場合は
 buildを利用する場合がある

【目次】

【本題】

同じ機能を持つ二つのメソッド

Railsには、モデルオブジェクトを生成するメソッドが
newとbuildの2種類存在します。

どちらも同じ機能なのに、なぜ二つ存在するのでしょうか?
今回は、それをまとめます。

buildは関連付けされたモデル用だった

かなり古いバージョンのRailsでは、
buildは関連付けされたモデル用のメソッドで、
newはどこにも関連付けされていないモデル用のメソッドでした。

buildで生成されたモデルオブジェクトには、
関連付けされたモデルの外部キーが自動でセットされます。

つまり、Userモデルと関連付けさせている場合は、
「user_id」がセットされます。

具体例を出すと、下記二つのコードは、 両方とも「user_id」がセットされた状態になります。

@campaign = Campaign.new(user_id: current_user.id)
@campaign = current_user.campaigns.build

buildはnewのエイリアス

但し、現行バージョン(4系・5系)では、
newでも外部キーがセットされる様になり、
buildはnewのエイリアスという位置付けになっています。

エイリアスとは、ショートカットの様なもので、
つまり、newとbuildは全く同じ機能になったというわけです。

慣例としての使い分け

以上の通り、機能面では全く同じですが、
可読性などの観点から、これまでの慣例として
関連付けされたモデルのオブジェクトを生成する際には、buildを使い、
それ以外でnewを用いるという使い分けがなされています。
(うちの職場もそうです)

《今日の学習進捗(3年以内に10000時間に向けて)》

学習開始からの期間 :111日
今日までの合計時間:1042h
一日あたりの平均学習時間:9.4h
今日までに到達すべき目標時間:1014h
目標との解離:28h
「10,000時間」まで、

残り・・・「8958時間!」