コード日進月歩

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

RailsにおいてModelのcreate!はブロックで囲めるし、それで関連レコードの作成ができる

こんな書き方あるんだ的なメモ

環境

$ bin/rails -v
Rails 5.2.2

やり方

今回使うモデル

# == Schema Information
#
# Table name: users
#
#  id         :bigint(8)        not null, primary key
#  name       :string(255)
#  created_at :datetime         not null
#  updated_at :datetime         not null
#

class User < ApplicationRecord
  has_many :message
end
# == Schema Information
#
# Table name: messages
#
#  id         :bigint(8)        not null, primary key
#  name       :string(255)
#  user_id    :integer
#  created_at :datetime         not null
#  updated_at :datetime         not null
#

class Message < ApplicationRecord
  belongs_to :user
end

書き方

createした自分自身をブロックに渡すことができる

User.create!(name: "Taro") { |user| Message.create(user: user) }
#   (0.3ms)  BEGIN
#  User Create (0.3ms)  INSERT INTO `users` (`name`, `created_at`, `updated_at`) VALUES ('Taro', '2018-12-24 17:12:42', '2018-12-24 17:12:42')
#  Message Create (0.3ms)  INSERT INTO `messages` (`user_id`, `created_at`, `updated_at`) VALUES (8, '2018-12-24 17:12:42', '2018-12-24 17:12:42')
#   (0.4ms)  COMMIT
#   (0.1ms)  BEGIN
#   (0.1ms)  COMMIT

同時にコミットしてくれるのでいろいろ整合性を取るときなどに便利。