よしだです

プログラミングの勉強してます

buildとnewの違いとは・・・。

buildとnew・・・何が違うんだ・・・。

 

ということで調べます。

 

 

まず、newに関しては説明はいらないと思いますが、クラスのインスタンスを作成するメソッドですね。

 

@user = User.new(name: "Taro")

=> #<User id: nil, name: "Taro", created_at: nil, updated_at: nil >

 

@user.save

=> #<User id: 1, name: "Taro", created_at: "作成時刻", updated_at: "更新時刻">

 

となります。

 

さて、buildは2つのデータベースを関連させるときに現れます。

なので2つのデータベースを用意します。

UserモデルとBookモデルです。

UserはたくさんのBookを持ち。

Bookは一人のUserに所有されているような状態にします。

 

Userモデルに

has_many :books

Bookモデルに

belongs_to :user

ですね。

 

まず、ユーザーを作成します。

user1 = User.new(name: "Taro")

user1.save

=> #<User id: 1, name: "Taro", created_at: "作成時刻", updated_at: "更新時刻">

 

ここまでは先ほどと同じです。

 

次に、 ユーザーに所有されているBookを作成します。

book1 = user1.books.build(title: "1")

=> #<Book id:  nil, user_id: 1, title: "1", created_at: nil, updated_at: nil>

book1.save

=> #<Book id: 1, user_id: 1, title: "1", created_at: "作成時刻", updated_at: "更新時刻">

 

紐付けされて作成されました。

次に、newで作ってみましょう

 

タイトルだけ変えます。

book2 = user1.books.new(title: "2")

=> #<Book id:  nil, user_id: 1, title: "2", created_at: nil, updated_at: nil>

book1.save

=> #<Book id: 2, user_id: 1, title: "2", created_at: "作成時刻", updated_at: "更新時刻">

 

 

ん?

 

同じですね。

 

 

ちょっとググります。

 

 

 

...

 

 

 

結論からいうと、ありません。

user = User.first
user.comments.new
=> #<Comment id: nil, body: nil, user_id: 1, created_at: nil, updated_at: nil>
user.comments.build
=> #<Comment id: nil, body: nil, user_id: 1, created_at: nil, updated_at: nil>

昔は、newだと上のuser_idが入らなかったみたいですね。

今はどちらも入るようになっています。

そのため、慣習的に関連するモデルを生成するときは、buildを使うようです。 

 

qiita.com

 

 

ないんかい!!!!!!

 

まあ・・・今までの慣習に従って、関連付けされたデータを作る時はbuildを使いましょう。

 

以上!!!!