Rails:当旧对象替换为new时删除belongs_to对象

时间:2013-09-13 08:39:05

标签: ruby-on-rails activerecord belongs-to destroy

这是方案

我有医院模型和联系模式。在某些情况下,我们有这种关系。

注意:这不是实际的代码。我必须简化它以摆脱不必要的代码行。

class Hospital < ActiveRecord::Base  
     attr_accessible :contact_id  
     belongs_to :contacts
end

class Contact <ActiveRecord::Base
    attr_accessible :phone_number
end

如果我想更改联系号码,我们会创建一个新联系人,并使用此新联系人对象的ID替换Hospital的contact_id。

当发生这种情况时,需要销毁旧接触。是否存在类似于:dependent =&gt;:destroy的关系条件,它可以自动执行相同的操作吗?如果没有,我应该遵循一种技术来实现这种行为。

谢谢。

2 个答案:

答案 0 :(得分:1)

没有内置功能可以执行您想要的操作,但您可以通过回调将功能保留在模型所属的位置。

编写一个由适当的回调(例如:after_update)调用的方法,该方法检查contact_id是否已更改,获取旧值并销毁该对象:

class Hospital < ActiveRecord::Base  
  attr_accessible :contact_id  
  belongs_to :contacts

  after_update :check_contact

  def check_contact
    if contact_id_changed?
      Contact.find(contact_id_was).destroy
    end
  end
end

我没有测试过这个,但它应该让你开始,这里是相关工具的文档:

答案 1 :(得分:-1)

据我所知,没有具体的功能。 有一些疑问,为什么要创建新的联系对象?相反可以更新同一个对象。 另一种方法是在您对Hospital对象进行更新之前存储ID,并在成功更新后销毁Contact对象,但这不是一个好习惯。 谢谢。