質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

Q&A

0回答

336閲覧

build時にdestroyが走るのは何故でしょうか?

pecchan

総合スコア555

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

0グッド

1クリップ

投稿2022/08/04 10:30

編集2022/08/04 10:31

ruby on rails初心者です。
rails5.2.5と7.0.3で確認しました。

has_one関連付けされたモデル同士、既にデータがある状態で

ruby

1@user.build_license

すると内部的に既存データに対してdestroyが走ることに気付きました。

これはどういう意図なのでしょう?

has_oneなので
1つだけ持つ事を守るため、既存データを消しbuildしたデータを挿入するため
という意図なのでしょうか?

分かる方教えて下さい。

試したコードは以下です。

userは1つのライセンスを持つ(has_one)というイメージで試しました。

マイグレーション
(unique:falseにしても現象同じでした→ただ、has_oneの意味がなくなるのでアレですけど)

ruby

1class CreateUsers < ActiveRecord::Migration[7.0] 2 def change 3 create_table :users do |t| 4 t.string :name 5 t.timestamps 6 end 7 end 8end 9 10class CreateLicenses < ActiveRecord::Migration[7.0] 11 def change 12 create_table :licenses do |t| 13 t.belongs_to :user, index: { unique: true }, foreign_key: true 14 t.string :name 15 t.timestamps 16 end 17 end 18end

モデル

ruby

1class User < ApplicationRecord 2 has_one :license, dependent: :destroy 3end 4 5class License < ApplicationRecord 6 belongs_to :user 7end 8

irbで確認

irb

1irb(main):004:0> User.create(name: '西田') 2irb(main):005:0> License.create(user_id: 1, name: "教員免許") 3irb(main):006:0> user = User.first 4irb(main):007:0> user.build_license 5TRANSACTION (0.1ms) begin transaction 6License Destroy (0.3ms) DELETE FROM "licenses" WHERE "licenses"."id" = ? [["id", 1]] 7TRANSACTION (1.4ms) commit transaction 8

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問