どうもこんにちは。
今回は、モデル同士の関連付けを定義する時によく使用されるhas_many
での便利なオプションautosave: true
についてメモします。
以降は、以下の記事の知識(build
メソッド)を使用しています。
has_manyってなに?
has_many
とは、モデル同士を関連付けるためにbelongs_to
と一緒に使用するものです。
UserモデルにPostモデルが子として紐づいていることを定義したい場合は、以下のように定義します。
# Userモデル
class User < ApplicationRecord
has_many :posts
end
# Postモデル
class Post < ApplicationRecord
belongs_to :user
end
has_manyにはオプションがいくつかあり、最も使用されるものはdependent: :destroy
だと思います。
dependent: :destroy
については以下の記事で紹介しています。
今回はautosave: true
について紹介します。
定義の仕方
autosave: true
の定義の仕方は、以下のように記述するだけです。
# Userモデル
class User < ApplicationRecord
has_many :posts, autosave: true
end
これだけです。あとはcreate
メソッドを記述して動きをみてみます。
実際の動き
以下のコードは「ユーザが作成されると同時にPostオブジェクトも作成される」前提でコードを記述しています。
class UsersController < ApplicationController
def create
user = User.new(name: '試験太郎', age: 25)
post = user.posts.build(title: 'テスト投稿', content: '今日はいい天気ですね')
if user.save
redirect_to users_path
else
render :new
end
end
end
上記のコードでは、post.save
を実行していません。しかし、DBには、保存されています。
これは、modelにautosave: true
を記述しているからです。これによって、user.save
が実行されたタイミングでpostも保存されます。
以上