【问题标题】:Possible to not allow deleting a model, but allow it being destroyed as a dependency in Rails/ActiveRecord?可能不允许删除模型,但允许它作为 Rails/ActiveRecord 中的依赖项被销毁?
【发布时间】:2014-02-10 10:07:50
【问题描述】:

由于依赖问题,我无法销毁特定​​对象a。销毁它的方法是销毁一个不同的对象b,该对象具有dependent: :destroy,因为它的belongs_to关联到a

class A < ActiveRecord::Base
  #don't ever delete this directly
  has_one :b, dependent: :destroy
end
class B < ActiveRecord::Base
  #delete this object instead and it will automatically delete A
  belongs_to :a, dependent: :destroy
end

有没有办法指定不允许删除a,但在删除b时仍然允许删除?

我可以把这个放在A:

before_destroy :prevent_destroy

private
def prevent_destroy
  false
end

但是A 不会作为B 的依赖项被删除。

【问题讨论】:

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


    【解决方案1】:

    我不确定我是否正确理解了这个问题。可以

    class A < ActiveRecord::Base
      #don't ever delete this directly
      has_one :b, dependent: :restrict
    end
    

    为你工作?

    【讨论】:

    • :restrict做的,如果b存在就不允许直接删除?
    • 是的。如果它有任何关联的对象,Rails 将不允许销毁特定对象。
    • 但不是也不允许通过依赖机制删除吗?如果它作为被破坏对象的依赖项,我基本上需要将其删除,但如果我尝试直接删除它,则不应允许它被删除。
    • 如何使用类变量作为标志,并提供访问该变量的接口。在 B 中,添加类似:“before_destroy :set_flag_ture; after_destroy :set_flag_false”。在 A 中:“before_destroy :check_flag_if_true”。而flag就是可以通过接口什么的访问的类变量或者全局变量值。
    【解决方案2】:

    您可以检查是否在回调中设置了destroyed_by_association。比如:

    before_destroy :prevent_destroy
    
    private
    def prevent_destroy
      destroyed_by_association     #nil is falsey
    end
    

    参考:http://api.rubyonrails.org/classes/ActiveRecord/AutosaveAssociation.html#method-i-destroyed_by_association

    【讨论】:

      猜你喜欢
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多