3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Rails】has_manyでオートセーブが設定できるのは便利

Last updated at Posted at 2024-02-06

どうもこんにちは。

今回は、モデル同士の関連付けを定義する時によく使用される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も保存されます。

以上

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?