Ruby on rails 什么';摧毁自我参照关联双方的最佳方式是什么?

Ruby on rails 什么';摧毁自我参照关联双方的最佳方式是什么?,ruby-on-rails,associations,self-reference,Ruby On Rails,Associations,Self Reference,在我的项目中,我有一个自指关联 我有一个用户模型: class User < ActiveRecord::Base has_many :relationships, :dependent => :destroy has_many :peers, :through => :relationships end class用户:破坏 拥有多个:对等点,:通过=>:关系 结束 以及关系模型: class Relationship < ActiveRecord::Bas

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

我有一个用户模型:

class User < ActiveRecord::Base
  has_many :relationships, :dependent => :destroy
  has_many :peers, :through => :relationships
end
class用户:破坏
拥有多个:对等点,:通过=>:关系
结束
以及关系模型:

class Relationship < ActiveRecord::Base
  belongs_to :user
  belongs_to :peer, :class_name => "User"
end
类关系“用户”
结束
当两个用户彼此对等时,数据库中显然有两条记录

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


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

有几种方法可以完成此操作

首先是删除后的触发器,如果您相信数据库不可知论的错误承诺,那么这是一种相当有争议的方法,但实际上是一种有效的方法-本质上,您查看old.peer_id和old.user_id,然后执行删除操作,但颠倒角色。如果您想沿着这条路线走下去,您应该参考数据库手册,了解如何实现触发器

第二种方法是销毁后的
回调,在那里执行

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

另一个——可能是更激烈的措施是修改模型,使其具有一个布尔接受字段,其中关系的双方都由数据库中的一条记录建模,对记录有一个约束,其中
(peer\u id,user\u id)=(user\u id,peer\u id)
。这样,您就不必担心删除双方,也不必担心重复记录。

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

首先是删除后的触发器,如果您相信数据库不可知论的错误承诺,那么这是一种相当有争议的方法,但实际上是一种有效的方法-本质上,您查看old.peer_id和old.user_id,然后执行删除操作,但颠倒角色。如果您想沿着这条路线走下去,您应该参考数据库手册,了解如何实现触发器

第二种方法是销毁后的
回调,在那里执行

after_destroy do |record| 
  other = Relationship.find_by_user_id_and_peer_id(record.peer_id, record.user_id)
  other.destroy if other
end
另一个——可能是更激烈的措施是修改模型,使其具有一个布尔接受字段,其中关系的双方都由数据库中的一条记录建模,对记录有一个约束,其中
(peer\u id,user\u id)=(user\u id,peer\u id)
。这样,您就不必担心删除双方,也不必担心重复记录