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: "更新時刻">
ん?
同じですね。
ちょっとググります。
...
結論からいうと、ありません。
昔は、newだと上のuser_idが入らなかったみたいですね。
今はどちらも入るようになっています。
そのため、慣習的に関連するモデルを生成するときは、
build
を使うようです。
ないんかい!!!!!!
まあ・・・今までの慣習に従って、関連付けされたデータを作る時はbuildを使いましょう。
以上!!!!