rails4依赖销毁回调错误

时间:2016-05-23 10:51:54

标签: ruby-on-rails validation activerecord callback

我在role模型上有一个ProductUser属性。用户可以被owner(角色)删除,我想确保所有者在product存在时无法删除自己。但是,当product被删除后,所有product_users都应该消失,包括所有者。

当我尝试删除ActiveRecord::RecordNotDestroyed - Failed to destroy the record时,以下代码会引发product错误。我想这是因为dependent: :destroy导致的执行顺序。我怎样才能做到这一点?

class ProductUser < ActiveRecord::Base
  belongs_to :user
  belongs_to :product, touch: true

  before_destroy :check_for_owner

  def check_for_owner
    if product && role == "owner" #If I use simply: if role == "owner", it still doesn't work.
      errors[:base] << "Owner can't be deleted!"
      return false
    end
  end
end


class Product < ActiveRecord::Base
  has_many :product_users, dependent: :destroy
  ....
end

1 个答案:

答案 0 :(得分:2)

如果用户是所有者,您是否认为根本没有显示ProductUser记录的删除按钮?

在任何情况下,如果您使用外键而不是依赖销毁,那么销毁将在数据库级别进行,并且产品用户模型将不会被实例化,这将解决您的问题。

所以在迁移中

def change
  add_foreign_key :product_users, :products, on_delete: :cascade
end

然后在产品上删除依赖销毁选项

class Product < ActiveRecord::Base
  has_many :product_users
end

使用on delete cascade选项,数据库将在删除产品时销毁产品的产品用户。