コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

Railsにおける未保存状態のリレーションモデルのつくりかた

リレーションするモデルも一気に保存したい、という場合の逆引きマニュアル的なもの

環境

$ bin/rails -v
Rails 5.2.2

やり方

has_many の場合と has_one で書き方が違う

has_manyの場合

{{has_manyをつけたモデルのインスタンス}}.{{belongs_toのモデル名の単数}}.build

has_oneの場合

{{has_oneをつけたモデルのインスタンス}}.build_{{belongs_toのモデル名の単数}}

こんなモデルがある場合

class User < ApplicationRecord
  has_many :message
  has_one :user_profile
end
class Message < ApplicationRecord
  belongs_to :user
end
class UserProfile < ApplicationRecord
  belongs_to :user
end

以下のように使う

user = User.new(name: "KenShiro")

user.message.build(name:"Hello!")
# => #<Message id: nil, name: "Hello!", user_id: nil, created_at: nil, updated_at: nil>

user.build_user_profile(age:10)
# => #<UserProfile id: nil, user_id: nil, age: 10, created_at: nil, updated_at: nil>

こんな感じで未保存のモデルが作られるので、userをsaveすれば連動して全てのレコードが作られる

参考サイト