Rails - AciveRecord 使用:dependent => :有条件销毁

发布于 2024-11-08 07:20:52 字数 537 浏览 0 评论 0原文

根据条件销毁对象的所有依赖项的最佳/DRY 方法是什么。 ?

例如:

class Worker < ActiveRecord::Base
 has_many :jobs , :dependent => :destroy
 has_many :coworkers , :dependent => :destroy
 has_many :company_credit_cards, :dependent => :destroy
end 

条件将是 关于销毁:

if self.is_fired? 
 #Destroy dependants records
else
 # Do not Destroy records
end 

有没有办法在 :dependent 条件下使用 Proc。 我已经找到了单独销毁依赖项的方法,但这对于进一步的关联来说并不干燥和灵活,

注意:我已经编写了示例..不是实际的逻辑

What will be the best/DRY way to destroy all the dependents of an object based on a condition. ?

Ex:

class Worker < ActiveRecord::Base
 has_many :jobs , :dependent => :destroy
 has_many :coworkers , :dependent => :destroy
 has_many :company_credit_cards, :dependent => :destroy
end 

condition will be
on Destroy:

if self.is_fired? 
 #Destroy dependants records
else
 # Do not Destroy records
end 

Is There a Way to use Proc in the :dependent condition.
I have found the methods to destroy the dependents individually, but this is not DRY and flexible for further associations,

Note: I have made up the example.. not an actual logic

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

计㈡愣 2024-11-15 07:20:52

不,您应该删除 :dependent => :destroy 并添加 after_destroy 回调,您可以在其中编写您想要的任何逻辑。

class Worker < ActiveRecord::Base
  has_many :jobs
  has_many :coworkers
  has_many :company_credit_cards
  after_destroy :cleanup

  private
  def cleanup
    if self.is_fired?
      self.jobs.destroy_all
      self.coworkers.destroy_all
      self.company_credit_cards.destroy_all
    end
  end
end 

No. You should remove :dependent => :destroy and add after_destroy callback where you can write any logic you want.

class Worker < ActiveRecord::Base
  has_many :jobs
  has_many :coworkers
  has_many :company_credit_cards
  after_destroy :cleanup

  private
  def cleanup
    if self.is_fired?
      self.jobs.destroy_all
      self.coworkers.destroy_all
      self.company_credit_cards.destroy_all
    end
  end
end 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文