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)
。这样,您就不必担心删除双方,也不必担心重复记录