1

在我的项目中,我有一个自引用关联。

我有一个用户模型:

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

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

当一个用户选择结束一段关系时,我希望这会破坏两条记录 - 而不仅仅是关系的一侧。

有没有更好的方法来执行此操作,而不是在控制器中加载关系两次(关系的每一侧一次)?

4

1 回答 1

1

有几种方法可以做到这一点

首先是删除后触发器,如果​​您相信数据库不可知论的虚假承诺,这是一种非常有争议的做事方式,但它确实有效 - 本质上,您查看 old.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

另一种可能更激进的措施是重新设计模型,使其具有一个布尔接受的字段,其中关系的双方都由数据库中的一条记录建模,对记录有限制 where (peer_id, user_id) = (user_id, peer_id)。这样您就不必担心删除双方,也不必担心重复记录。

于 2011-01-06T23:06:59.173 回答