Rails

【Rails】モデルの関連付けで用いられるbuildメソッドまとめ

Rails

 

今回は、モデルの関連付けで用いられるbuildメソッドについて解説したいと思います。アソシエーションの記述によって、buildメソッドの書き方は異なってくるので、この機会におさらいしておきましょう。

buildメソッドとは

buildメソッドとは、インスタンスを生成するメソッドです。また、モデルの関連付けでもbuildメソッドは用いられます。

インスタンスを生成するメソッドは他にnewメソッドがありますが、buildメソッドとの違いはありません。ただ以下の文言にもあるように、モデルの関連付けの際はbuildメソッドを使う約束があるようです。

暗黙の了解で、モデルを関連付けした時にはbuildを使うみたいな感じになっています。

参考:newとbuildの違い – Qiita

buildメソッドの記述方法

では次にbuildメソッドの記述方法について見ていきましょう。buildメソッドの書き方には、以下の3つのパターンで異なります。

  • アソシエーションが1対1
  • アソシエーションが1対多
  • アソシエーションが多対多

アソシエーションが1対1

モデルの記述が以下の場合だと仮定します。

↓ user.rb

class User < ActiveRecord::Base
  has_one :card
end

 

↓ card.rb

class Card < ActiveRecord::Base
  belongs_to :user
end

 

この場合では、モデルの関連付けの記述は以下のようになります。1対1の場合では、「build_関連付けのメソッド名」となることを覚えておきましょう。

@user = User.new
@card = @user.build_card

アソシエーションが1対多

モデルの記述が以下の場合だと仮定します。

↓ user.rb

class User < ActiveRecord::Base
  has_many :cards
end

 

↓ card.rb

class Card < ActiveRecord::Base
  belongs_to :user
end

 

この場合では、モデルの関連付けの記述は以下のようになります。1対多の場合では、「関連付けメソッド名.build」となることを覚えておきましょう。

@user = User.new
@card = @user.cards.build

アソシエーションが多対多

モデルの記述が以下の場合だと仮定します。中間テーブルとして、group_userモデルを作成しています。

↓ user.rb

class User < ApplicationRecord
  has_many :group_users
  has_many :groups, through: :group_users
end

 

↓ group.rb

class Group < ApplicationRecord
  has_many :group_users
  has_many :users, through: :group_users
end

 

↓ group_user.rb(中間テーブル)

class GroupUser < ApplicationRecord
  belongs_to :group
  belongs_to :user
end

 

この場合でのモデルの関連付けの記述は以下のようになります。多対多の場合では、1対多の場合と同じで「関連付けメソッド名.build」となることを覚えておきましょう。

@user = User.new
@group = @user.groups.build
こうすることで、中間テーブルであるgroup_usersテーブルにも自動的に反映されるようになります。

まとめ

  • 1対1の場合では、「build_関連付けのメソッド名」となる
  • 1対多の場合では、「関連付けメソッド名.build」となる
  • 多対多の場合では、「関連付けメソッド名.build」となる

 

 

今回はモデルの関連付けで用いられるbuildメソッドについて解説しました。アソシエーションの記述によってbuildメソッドの使い方は変わってくるので、ぜひこの機会に理解しておきましょう。