【问题标题】:Nullify all inheritors of the root class on destroy在销毁时使根类的所有继承者无效
【发布时间】:2013-12-12 20:02:18
【问题描述】:

鉴于以下情况:

class Foo < ActiveRecord::Base; end
class Bar < Foo; end
class Baz < Foo; end

当带有has_many :foos 的类被删除时,是否有一种“Rails'y”方式来取消所有Bars 和Bazs 的外键?这似乎不起作用:

class Quux < ActiveRecord::Base
  has_many :foos, dependent: :nullify
end

我意识到我可以在 before/after_destroy 回调中执行此操作,但我想知道是否有更规范的方式来执行此操作。谢谢!

更新

我目前的解决方案:

class Quux < ActiveRecord::Base
  after_destroy :nullify_foos

  private

  def nullify_foos
    Foo.where(quux_id: id).update_all(quux_id: nil)
  end
end

# (results in two queries?)
class Quux < ActiveRecord::Base
  has_many :bars, dependent: :nullify
  has_many :bazs, dependent: :nullify
end

【问题讨论】:

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


    【解决方案1】:

    我相信你的意思是你的 has_many 关联中的:dependent =&gt; :destroy

    has_many :foos, dependent: :destroy

    这最终可能会在后端调用:nullify,但只有在实际删除数据行不可行时才会这样做。

    此处引用:http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

    【讨论】:

    • 我希望 Rails 保证所有Foos 都只会被取消。
    • 实际上,我认为你是对的,我不确定 Rails 是否会按照你想要的方式沿着层次结构树向上移动。您可能需要使用回调方法来保证您的结果。测试一下?现在,我很好奇。
    • 按照我想象的方式,它不会上升到层次结构,而是下降到继承自它的任何东西。鉴于 Rails 已经足够聪明,可以实现 STI,这似乎是合理的。
    猜你喜欢
    • 1970-01-01
    • 2017-11-07
    • 2013-09-29
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多