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
あなたの回答
tips
プレビュー