未在before_destroy回调中加载的关联

时间:2013-01-05 19:11:29

标签: ruby-on-rails-3 activerecord callback

我有一个简单的User& Account模型。如果帐户附加了用户,我想阻止删除帐户。我创建了一个User和一个Account并将它们关联起来。然后,我在控制台上Account.find(x).destroy。该帐户被销毁!

注意:

  1. 用户account_id是正确的。
  2. Account.find(x).users.empty?在控制台返回false
  3. Account.find(x).destroyable?在控制台返回true
  4. {li} users.empty? def destroyable?返回true !!

    我做错了什么?它是什么?

    代码(Ruby 1.9.2-p290上的Rails 3.2.9):

    class User < ActiveRecord::Base
      belongs_to :account
    end
    
    class Account < ActiveRecord::Base
    
      has_many :users, dependent: :destroy
      attr_accessible :name
      before_destroy :destroyable?
    
      def destroyable?
        if users.empty? # This returns true when called via callback.
          true
        else
          false
        end
      end
    
    end
    

2 个答案:

答案 0 :(得分:7)

所以,事实证明这是另一个Rails的陷阱。

解决方案是将before_destroy移到has_many来电之上。

@Yves Senn,你是对的。从现在开始我会避开它。 在这种情况下,使用dependent: :restrict代替dependent :destroy,无需我的before_destroy回调。

答案 1 :(得分:1)

我认为问题是dependent: :destroy。如果您不想销毁具有关联用户的帐户,则不应添加从属选项。

这也是非常危险的,因为它可能会意外地摧毁用户。