質問をご覧いただきましてありがとうございます。
Railsでの開発でDBにPostgresを利用しています。
RailsはAPIモードで使用しています。
以下の環境でUserとProfileを同時にUpdateを実行すると関連モデルが一旦削除されてから新たにInsertされていることに気づきました。
モデルは下記の通りです
User(has_one=>Profile)
ruby
1class User < ActiveRecord::Base 2 3 devise :database_authenticatable, 4 :registerable, 5 :recoverable, 6 :rememberable, 7 :validatable, 8 authentication_keys: [:login_id] 9 10 11 12 include DeviseTokenAuth::Concerns::User 13 14 15 has_one :profile, dependent: :destroy 16 accepts_nested_attributes_for :profile 17end
Profile(belongs_to=>User)
class Profile < ApplicationRecord belongs_to :user accepts_nested_attributes_for :user end
UserController
Ruby
1class Admin::UsersController < ApplicationController 2 before_action :set_user, only: %i[show update destroy] 3 4 # PATCH/PUT /admin/users/1 5 def update 6 test_params = { profile_attributes: { first_name: 'AAA' } } 7 8 if @user.update(test_params) 9 render json: @user 10 else 11 render json: @user.errors, status: :unprocessable_entity 12 end 13 end 14 15 private 16 17 # Use callbacks to share common setup or constraints between actions. 18 def set_user 19 @user = User.find(params[:id]) 20 end 21 22 23end 24
上記のコードでUserControllerのupdate
を実行すると、Profileのfirst_nameが更新されるのですが、実際のログを見ると更新されているのではなく、一旦既存のProfileレコードを削除してあらたにレコードをInsertしている挙動でした。
この動作について、少し気持ち悪い感じがするのですが通常の挙動なのでしょうか?
その際の、ログも下記に記載いたします。
log
1(0.4ms) BEGIN 2 ↳ app/controllers/admin/users_controller.rb:38 3 Profile Load (0.7ms) SELECT "profiles".* FROM "profiles" WHERE "profiles"."user_id" = $1 LIMIT $2 [["user_id", 114], ["LIMIT", 1]] 4 ↳ app/controllers/admin/users_controller.rb:38 5 Profile Destroy (0.6ms) DELETE FROM "profiles" WHERE "profiles"."id" = $1 [["id", 145]] 6 ↳ app/controllers/admin/users_controller.rb:38 7 Location Load (0.9ms) SELECT "locations".* FROM "locations" WHERE "locations"."id" = $1 LIMIT $2 [["id", 3], ["LIMIT", 1]] 8 ↳ app/controllers/admin/users_controller.rb:38 9 Profile Create (0.7ms) INSERT INTO "profiles" ("user_id", "name", "created_at", "updated_at", "first_name") VALUES ($1, $2, $3, $4, $5) RETURNING "id" [["user_id", 114], ["name", "AAA "], ["created_at", "2021-08-01 16:05:37.273040"], ["updated_at", "2021-08-01 16:05:37.273040"], ["first_name", "AAA"]] 10 ↳ app/controllers/admin/users_controller.rb:38 11 (1.5ms) COMMIT
皆様の知識を共有していただければ非常に助かります。
どうぞよろしくお願いいたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。