rails でアプリを開発しています。UserモデルとContract(契約)モデルがあってUserとContractは1対多の関係にあるけれど必ずしもUserに結びついていなくても良いという設計をしたいです。(ECサイトなどで会員登録なしで手続きができるようなもの)
そこでContractモデルを持ったUserを削除しようとすると次のエラーが出ました。
$myapp(add-contract-model *) $ be rails c Loading development environment (Rails 5.1.7) irb(main):001:0> user =User.last User Load (0.2ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT ? [["LIMIT", 1]] => #<User id: 56, name: "Alex", email: "alexandros@example.com", created_at: "2019-05-11 16:46:39", updated_at: "2019-05-11 16:46:57", password_digest: "$2a$10$EdvhTICXFX5eSU0YiseJ1u5a/kMl3a5FUi1b7NsOmiD...", info_mail: true, remember_digest: nil, admin: false, activation_digest: "$2a$10$74LztKR5t21vcewcwgjckejWxU1FiEG8IWDqlv1L/zY...", activated: true, activated_at: "2019-05-11 16:46:57", reset_digest: nil, reset_sent_at: nil> irb(main):002:0> user.contracts Contract Load (0.2ms) SELECT "contracts".* FROM "contracts" WHERE "contracts"."user_id" = ? ORDER BY "contracts"."created_at" DESC LIMIT ? [["user_id", 56], ["LIMIT", 11]] => #<ActiveRecord::Associations::CollectionProxy [#<Contract id: 6, other_content: "This is second contraction of Alex", user_id: 56, created_at: "2019-05-16 06:21:38", updated_at: "2019-05-16 06:21:38">, #<Contract id: 5, other_content: "I am Alex!", user_id: 56, created_at: "2019-05-16 06:20:58", updated_at: "2019-05-16 06:20:58">]> irb(main):003:0> user.destroy (0.1ms) begin transaction SQL (1.2ms) DELETE FROM "users" WHERE "users"."id" = ? [["id", 56]] (6.3ms) rollback transaction Traceback (most recent call last): 1: from (irb):3 ActiveRecord::InvalidForeignKey (SQLite3::ConstraintException: FOREIGN KEY constraint failed: DELETE FROM "users" WHERE "users"."id" = ?) irb(main):004:0>
このエラーについて調べたところ、親モデルへのリンクを無効とするような削除はできないということらしいので、削除する前にUserモデルで
user.rb
rb
1 def add_nil 2 contracts.each { |n| n.user_id = nil } 3 end 4
このようにあらかじめ親モデルへのリンクをなくした状態でdesroyしたのですが
users_controller.rb
erb
1 def destroy 2 user = User.find(params[:id]) 3 user.add_nil 4 user.destroy 5 flash[:success] = "削除しました" 6 redirect_to users_url 7 end
同様のエラーがでました。
のちにコンソールでadd_nilの部分だけ調べてみたら、ちゃんとuser_idはnilになっていました。
どなたかわかる方がいらっしゃいましたら ご教授ください。よろしくお願いします。
contract.rb
class Contract < ApplicationRecord belongs_to :user, optional: true default_scope -> { order(created_at: :desc) } end
バージョン
rails 5.1.6
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/16 09:34
2019/05/16 09:40
2019/05/16 09:50
2019/05/16 10:55
2019/05/16 13:02