UserモデルがPostモデルに対して1対多の関係の関係の時、Userのインスタンスに紐づくPostを条件でフィルターしようとした時の話です。
次のような各userに紐づくpostの絞り込みをして、絞り込みした結果を表示したいというような場合に、以下のような処理で実現しようとしました。
Ruby
1def search 2 @users = User.all 3 @users = @users.map do |user| 4 user.posts = user.posts.selet { |v| v.category == '日記' } 5 user 6 end 7 render json: @users, status: 204 8end
しかしこのコードを実行すると、
user.posts = user.posts.selet { |v| v.category == '日記' }
この部分のせいだと思うのですが、この条件に合致しないものは全てpostのuser_idがnull
として更新されてしまいます。
Railsのデバッグログを見ると以下のようなSQLが発行されていることが確認できました。(INの中のIDを確認すると、 v.category == '日記'
がfalse
となるものでした。)
Post Update All (32.1ms) UPDATE `posts` SET `posts`.`user_id` = NULL WHERE `posts`.`user_id` = 1 AND `posts`.`id` IN (1, 2, 3, 5, 6, 7, 14, 15, 16, 19, 20)
なぜ勝手にUPDATE処理がされてしまうのでしょうか?ドキュメントを見たり、検索しても有益な情報が得られませんでしたので質問させていただきます。何かご存知の方はご教授お願いします。
【補足】
リレーションではないモデルの属性に関しては勝手には更新されないので不思議に感じています。例えばUserモデルのnameカラムに対して、user.name = 'hoge'
としてもUPDATE処理は勝手にされません。リレーションの場合の再代入はUPDATEになる、という仕様が定められているのでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/06/23 18:06