摧毁自我指涉协会双方的最佳方法是什么?

时间:2011-01-06 22:06:18

标签: ruby-on-rails associations self-reference

在我的项目中,我有一个自我指涉的关联。

我有一个用户模型:

class User < ActiveRecord::Base
  has_many :relationships, :dependent => :destroy
  has_many :peers, :through => :relationships
end

和关系模型:

class Relationship < ActiveRecord::Base
  belongs_to :user
  belongs_to :peer, :class_name => "User"
end

当两个用户彼此对等时,数据库中显然有两条记录。

当一个用户选择结束关系时,我希望销毁两个记录 - 而不仅仅是关系的一方。

有没有更好的方法来做这个而不是在控制器中加载两次关系(关系的每一侧一次)?

1 个答案:

答案 0 :(得分:1)

可以做到这一点

首先是删除触发器之后,如果你相信数据库不可知论的错误承诺,这是一个非常有争议的做事方式,但是它是有效的 - 实质上,你看旧.peer_id和old.user_id然后执行删除但是撤消角色。如果您想沿着这条路走下去,您应该参考数据库手册,了解如何实现触发器。

第二种方式是after_destroy 回调,您可以在其中执行

after_destroy do |record| 
  other = Relationship.find_by_user_id_and_peer_id(record.peer_id, record.user_id)
  other.destroy if other
end

另一个 - 可能更激烈的措施是重做模型,以便它有一个布尔接受的字段,其中关系的两边都由数据库中的一条记录建模,对记录的约束{{1 }}。这样你就不必担心删除双方,也不必重复记录。