如何使用after_destroy回调删除同一个表中的另一条记录

时间:2016-06-13 10:58:39

标签: ruby-on-rails ruby ruby-on-rails-4

我在下面的列中有一个表

id,user_id,friend_user_id

如果A是B的朋友那么,我想插入两个记录,如 1. user_id:1,friend_user_id:2 2. user_id:2,friend_user_id:1

我是使用after_create回调完成的,如下所示

after_create do
        Friend.create(user_id: friend_user_id,friend_user_id: user_id)
    end

如果删除了任何一条记录,我想删除这两条记录。

我已尝试过after_destroy回调,如下所示。

after_destroy do
        Friend.where(friend_user_id: user_id,user_id: friend_user_id).first.destroy
    end

但我收到以下错误。

2.3.0 :002 > Friend.first.destroy
  Friend Load (0.4ms)  SELECT  "friends".* FROM "friends"  ORDER BY "friends"."id" ASC LIMIT 1
   (0.2ms)  begin transaction
  SQL (0.7ms)  DELETE FROM "friends" WHERE "friends"."id" = ?  [["id", 10]]
  Friend Load (0.3ms)  SELECT  "friends".* FROM "friends" WHERE "friends"."friend_user_id" = ? AND "friends"."user_id" = ?  ORDER BY "friends"."id" ASC LIMIT 1  [["friend_user_id", 1], ["user_id", 2]]
  SQL (0.1ms)  DELETE FROM "friends" WHERE "friends"."id" = ?  [["id", 11]]
  Friend Load (0.1ms)  SELECT  "friends".* FROM "friends" WHERE "friends"."friend_user_id" = ? AND "friends"."user_id" = ?  ORDER BY "friends"."id" ASC LIMIT 1  [["friend_user_id", 2], ["user_id", 1]]
   (0.3ms)  rollback transaction
NoMethodError: undefined method `destroy' for nil:NilClass
        from /home/ubuntu/workspace/app/models/friend.rb:39:in `block in <class:Friend>'

我是RoR的新手。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

你的代码在这里是非常错误的,你最终会得到SystemStackError,这会发生在after_create和after_destroy的两个地方。发生的事情是,当你销毁一个元素时,你的after_destroy回调会被执行,这将再次销毁一个元素,因为它已经删除了一个元素,它将再次执行一个回调,但是因为你删除了那个元素就是为什么你得到了这个错误NoMethodError: undefined method销毁'为nil:NilClass`,因为该元素已被删除,为了获得更清晰的图片使用相同的代码并做一个Friend.create,你会看到我在说什么。