Рельсы графических краев

Я обнаружил это недавно, когда пытался создать двунаправленные отношения в рельсах (http://www.dweebd.com/sql/modeling-bidirectional-graph-edges-in-rails/)

class Befriending < ActiveRecord::Base
  belongs_to :initiator, :class_name => :User
  belongs_to :recipient, :class_name => :User
  after_create do |b|
    BefriendingEdge.create!(:user => b.initiator, :befriending => b)
    BefriendingEdge.create!(:user => b.recipient, :befriending => b)
  end
end

class BefriendingEdge < ActiveRecord::Base
  belongs_to :user
  belongs_to :befriending
end

class User < ActiveRecord::Base
  has_many :befriending_edges
  has_many :friends, :through => :befriending_edges, :source => :user
  has_many :befriendings, :through => :befriending_edges, :source => :befriending
end

Но я просто не совсем понимаю, как это работает. Может ли кто-нибудь помочь объяснить мне. Это похоже на двойное own_to. Просто не совсем понял это.

Спасибо


person Cameron    schedule 07.05.2009    source источник


Ответы (1)


  1. я пользователь
  2. у меня есть друзья
  3. Мои друзья тоже пользователи

Способ смоделировать это с помощью графика (http://en.wikipedia.org/wiki/Graph_%28mathematics%29) заключается в следующем:

  • узлы, которые представляют пользователей/друзей
  • ребра, представляющие связи дружбы

Итак, да: с точки зрения баз данных «пользователи принадлежат пользователям»: мои друзья также являются пользователями. Но кроме того, дружба двунаправлена: если мы друзья, это значит, что я твой друг И ты мой друг.

Кроме того, использование отдельной модели для хранения ребер/отношений позволяет потенциально хранить дополнительную информацию о дружбе (например, «друзья с тех пор»).

person David Sulc    schedule 29.11.2010