Граф ребер рельсов - PullRequest
2 голосов
/ 08 мая 2009

Я нашел это недавно, когда пытался установить двунаправленные отношения в рельсах (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

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

Спасибо

1 Ответ

0 голосов
/ 29 ноября 2010
  1. Я пользователь
  2. У меня есть друзья
  3. Мои друзья также пользователи

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

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

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

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

...