どうもこんにちは。
今回はRailsで使いこなすと楽そうなbuild
メソッドについて調べました。
buildメソッドとは?
build
メソッドはnew
メソッドにかなり似たメソッドです。
ただし、場合によって、new
メソッドを使用するよりbuild
メソッドを使用することでコードの簡略化ができます。
newメソッドとの違い
newメソッド
- Active Recordモデルの新しいインスタンスを作成する
- モデルクラス自体に対して直接呼び出される
new_post = Post.new
- 関連付けを意識せずに単独でオブジェクトを作成する場合に使用される
buildメソッド
-
has_many
、has_one
、belongs_to
などの関連付けが定義されている場合に使用される - 関連付けられたオブジェクトの新しいインスタンスを作成し、そのインスタンスを親オブジェクトに自動的に紐付ける
- 関連付けを表すメソッドチェーンの一部として使用される
user = User.find(1)
new_post = user.posts.build(title: '新しい投稿', content: '投稿の内容')
特定の関連付けのコンテキスト内で新しいモデルインスタンスを作成し、そのインスタンスを自動的に関連付けるために使用されます。
使用する場面
build
メソッドを使用する場面は以下の条件が揃っている時です。
- モデル同士を
has_many
、has_one
、belongs_to
などでアソシエーション(関連づけ)を設定しているとき - アソシエーションされた状態で新しいインスタンスを作成したいとき
使用方法
has_manyで関連付けしているオブジェクトのインスタンスを作成する
以下のように関連付けが定義されているとします。
class User < ApplicationRecord
has_many :posts
end
IDが3のユーザーに紐づいたPostインスタンスを作成するには、以下のようにコードを記述します。
user = User.find(3)
post = user.posts.build
# newメソッドを使用するとこんな感じ
user = User.find(3)
post = Post.new(user_id: user.id)
これで、Postインスタンスのuser_id
カラムには3
と入っているはずです。
has_oneで関連付けしているオブジェクトのインスタンスを作成する
以下のように関連付けが定義されているとします。
class User < ApplicationRecord
has_one :profile
end
has_one
で関連付けされている場合には、メソッド名が異なります。
IDが4のユーザーに紐づいたPostインスタンスを作成するには、以下のようにコードを記述します。
user = User.find(4)
user_profile = user.build_profile
# newメソッドを使用するとこんな感じ
user = User.find(4)
user_profile = Profile.new(user_id: user.id)
これで、Postインスタンスのuser_id
カラムには4
と入っているはずです。
まとめ
belongs_to
で関連付けされているオブジェクトに紐づけてインスタンスを作成する方法もありますが、汎用性は高くないのでここでは紹介しないこととします。
han_one
,has_many
で関連付けしているオブジェクトのインスタンスを作成するにはbuild
メソッドを使えば、ぱっと見で「何と紐づいているのかな?」っていうのがわかりそうですね。