今回は、モデルの関連付けで用いられるbuildメソッドについて解説したいと思います。アソシエーションの記述によって、buildメソッドの書き方は異なってくるので、この機会におさらいしておきましょう。
buildメソッドとは
buildメソッドとは、インスタンスを生成するメソッドです。また、モデルの関連付けでもbuildメソッドは用いられます。
インスタンスを生成するメソッドは他にnewメソッドがありますが、buildメソッドとの違いはありません。ただ以下の文言にもあるように、モデルの関連付けの際はbuildメソッドを使う約束があるようです。
暗黙の了解で、モデルを関連付けした時にはbuildを使うみたいな感じになっています。
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
まとめ
- 1対1の場合では、「build_関連付けのメソッド名」となる
- 1対多の場合では、「関連付けメソッド名.build」となる
- 多対多の場合では、「関連付けメソッド名.build」となる
今回はモデルの関連付けで用いられるbuildメソッドについて解説しました。アソシエーションの記述によってbuildメソッドの使い方は変わってくるので、ぜひこの機会に理解しておきましょう。