我在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
答案 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选项,数据库将在删除产品时销毁产品的产品用户。