在我的项目中,我有一个自我指涉的关联。
我有一个用户模型:
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
当两个用户彼此对等时,数据库中显然有两条记录。
当一个用户选择结束关系时,我希望销毁两个记录 - 而不仅仅是关系的一方。
有没有更好的方法来做这个而不是在控制器中加载两次关系(关系的每一侧一次)?
答案 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 }}。这样你就不必担心删除双方,也不必重复记录。