4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Rails】buildメソッド結構有能かもしれない

Last updated at Posted at 2024-02-05

どうもこんにちは。

今回はRailsで使いこなすと楽そうなbuildメソッドについて調べました。

buildメソッドとは?

buildメソッドはnewメソッドにかなり似たメソッドです。
ただし、場合によって、newメソッドを使用するよりbuildメソッドを使用することでコードの簡略化ができます。

newメソッドとの違い

newメソッド

  • Active Recordモデルの新しいインスタンスを作成する
  • モデルクラス自体に対して直接呼び出される
new_post = Post.new
  • 関連付けを意識せずに単独でオブジェクトを作成する場合に使用される

buildメソッド

  • has_manyhas_onebelongs_toなどの関連付けが定義されている場合に使用される
  • 関連付けられたオブジェクトの新しいインスタンスを作成し、そのインスタンスを親オブジェクトに自動的に紐付ける
  • 関連付けを表すメソッドチェーンの一部として使用される
user = User.find(1)
new_post = user.posts.build(title: '新しい投稿', content: '投稿の内容')

特定の関連付けのコンテキスト内で新しいモデルインスタンスを作成し、そのインスタンスを自動的に関連付けるために使用されます。

使用する場面

buildメソッドを使用する場面は以下の条件が揃っている時です。

  • モデル同士をhas_manyhas_onebelongs_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メソッドを使えば、ぱっと見で「何と紐づいているのかな?」っていうのがわかりそうですね。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?