SakuraWi - BLog

WEBエンジニア。聴いたお話をまとめておく倉庫的な。スタックストックスタック!

【RubyonRails】newとbuildの違いについて【alias】


RubyonRailsにおける newbuildの違いについてまとめておきます。

結論から言うと、同じです。

環境

筆者が試した、またこの記事を書いた環境はこちらです。

$ 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で動かして試してみましょう!