Help us understand the problem. What is going on with this article?

rails5 has_many dependent: :delete_allでミスるとレコード全件消える

なんかたまにテーブルのレコード全部消えると思って調べた。

たまに1テーブルのレコードが全件消える。いつも同じテーブルというわけではない。
もちろん、全レコード削除するようなコード書いてないのに消える。
怖いので調べた。

ログ見てたら怪しいやついた。

jiburi-web | Started GET "/kamikakushi" for 172.22.0.1 at 2020-03-06 17:09:18 +0900
jiburi-web | Cannot render console from 172.22.0.1! Allowed networks: 127.0.0.0/127.255.255.255, ::1
jiburi-web |   Chihiro Destroy (6.1ms)  DELETE FROM `chihiros`
jiburi-web |   ↳ app/models/chihiro.rb:3:in `<class:Luser>'
jiburi-web |   
jiburi-web | ArgumentError (The :dependent option must be one of [:destroy, :delete_all, :nullify, :restrict_with_error, :restrict_with_exception], but is :3):

DELETE FROM chihirosしているやつがいた。
直後のエラーが怪しいので更に調査。

調べたら再現できた

chihiro.rb
class Chihiro < ApplicationRecord
  has_many :sens, dependent: :delete_all

  # :delete_allをミスして「:」を忘れ、delete_allにしてた。
  has_many :aburayas, dependent: delete_all

色々試した結果、わかったことは2つ。

  1. chihirosテーブルにレコードが存在する状態で、上のようなソースになっていると、DELETE FROM chihirosが実行される。
  2. 外部キーがきちんと貼られていれば、以下のようなActiveRecord::InvalidForeignKeyが発生するのでレコードは消えない。
jiburi-web | ActiveRecord::InvalidForeignKey (Mysql2::Error: Cannot delete or update a parent row: a foreign key constraint fails (`jiburi`.`chihiros`, CONSTRAINT `fk_rails_7f965bd3db` FOREIGN KEY (`aburaya_id`) REFERENCES `aburayas` (`id`))):

なぜそうなるのかわからない

理由がわからなくて辛い。。
どこのソースを追えばいいのか。
が、ミスしっぱなしで放置しなければ本番環境で発生しなさそう?

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away