RubyonRailsにおける new
と build
の違いについてまとめておきます。
結論から言うと、同じです。
環境
筆者が試した、またこの記事を書いた環境はこちらです。
$ rails -v Rails 5.1.3
newとbuild
基本的な使い方として、 以下のような例があると思います。
@user = User.new
controller.rb
そして、Userにアソシエーションが貼られているCommentがあったとします。
@user = User.first @comment = @user.comments.new @comment = @user.comments.build
それぞれ、@commentに入るオブジェクトは同様のものになります。
手元の試せる環境で動かしてみた結果は以下のようになりました。
[5] pry(main)> user.tags.new => #<Tag:0x007f89934a59b0 id: nil, name: nil, shampoo_id: nil, user_id: 1, created_at: nil, updated_at: nil> [6] pry(main)> user.tags.build => #<Tag:0x007f8993ccb798 id: nil, name: nil, shampoo_id: nil, user_id: 1, created_at: nil, updated_at: nil>
どちらも、user_idに 1が入った状態で生成されていることがわかります。
同じ挙動を示すコード
Rails自体のコードを読んで見ると、aliasが貼られていることがわかります。
def build(attributes = {}, &block) @association.build(attributes, &block) end alias_method :new, :build
git hubで確認ができるので、みてみてください!
rails/collection_proxy.rb at 39c1d2e1840674f2a58dc1ba610fd64a37e950fd · rails/rails · GitHub
以前のバージョンでは異なっていた
Railsのいくつかの前のバージョンでは、それぞれ挙動が違っていたみたいです。
@このような動作確認は、手元で動かして見ると理解が進みやすいです!
rails console
で動かして試してみましょう!