なんかたまにテーブルのレコード全部消えると思って調べた。
たまに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つ。
-
chihiros
テーブルにレコードが存在する状態で、上のようなソースになっていると、DELETE FROM chihiros
が実行される。 - 外部キーがきちんと貼られていれば、以下のような
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`))):
なぜそうなるのかわからない
理由がわからなくて辛い。。
どこのソースを追えばいいのか。
が、ミスしっぱなしで放置しなければ本番環境で発生しなさそう?